[llvm] r221903 - ARM: add @llvm.arm.space intrinsic for testing ConstantIslands.

Rafael EspĂ­ndola rafael.espindola at gmail.com
Tue Nov 18 17:56:36 PST 2014


nice idea!

On 13 November 2014 12:58, Tim Northover <tnorthover at apple.com> wrote:
> Author: tnorthover
> Date: Thu Nov 13 11:58:48 2014
> New Revision: 221903
>
> URL: http://llvm.org/viewvc/llvm-project?rev=221903&view=rev
> Log:
> ARM: add @llvm.arm.space intrinsic for testing ConstantIslands.
>
> Creating tests for the ConstantIslands pass is very difficult, since it depends
> on precise layout details. Having the ability to precisely inject a number of
> bytes into the stream helps greatly.
>
> Added:
>     llvm/trunk/test/CodeGen/ARM/space-directive.ll
> Modified:
>     llvm/trunk/include/llvm/IR/IntrinsicsARM.td
>     llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp
>     llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp
>     llvm/trunk/lib/Target/ARM/ARMInstrInfo.td
>
> Modified: llvm/trunk/include/llvm/IR/IntrinsicsARM.td
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/IntrinsicsARM.td?rev=221903&r1=221902&r2=221903&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/IR/IntrinsicsARM.td (original)
> +++ llvm/trunk/include/llvm/IR/IntrinsicsARM.td Thu Nov 13 11:58:48 2014
> @@ -20,6 +20,11 @@ let TargetPrefix = "arm" in {  // All in
>  def int_arm_thread_pointer : GCCBuiltin<"__builtin_thread_pointer">,
>              Intrinsic<[llvm_ptr_ty], [], [IntrNoMem]>;
>
> +// A space-consuming intrinsic primarily for testing ARMConstantIslands. The
> +// first argument is the number of bytes this "instruction" takes up, the second
> +// and return value are essentially chains, used to force ordering during ISel.
> +def int_arm_space : Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], []>;
> +
>  //===----------------------------------------------------------------------===//
>  // Saturating Arithmetic
>
>
> Modified: llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp?rev=221903&r1=221902&r2=221903&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp Thu Nov 13 11:58:48 2014
> @@ -1592,6 +1592,9 @@ void ARMAsmPrinter::EmitInstruction(cons
>      EmitJumpTable(MI);
>      return;
>    }
> +  case ARM::SPACE:
> +    OutStreamer.EmitZeros(MI->getOperand(1).getImm());
> +    return;
>    case ARM::TRAP: {
>      // Non-Darwin binutils don't yet support the "trap" mnemonic.
>      // FIXME: Remove this special case when they do.
>
> Modified: llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp?rev=221903&r1=221902&r2=221903&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp Thu Nov 13 11:58:48 2014
> @@ -674,6 +674,8 @@ unsigned ARMBaseInstrInfo::GetInstSizeIn
>        ++NumEntries;
>      return NumEntries * EntrySize + InstSize;
>    }
> +  case ARM::SPACE:
> +    return MI->getOperand(1).getImm();
>    }
>  }
>
>
> Modified: llvm/trunk/lib/Target/ARM/ARMInstrInfo.td
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrInfo.td?rev=221903&r1=221902&r2=221903&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/ARMInstrInfo.td (original)
> +++ llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Thu Nov 13 11:58:48 2014
> @@ -5621,3 +5621,8 @@ def : InstAlias<"umull${s}${p} $RdLo, $R
>  // is discarded.
>  def ITasm : ARMAsmPseudo<"it$mask $cc", (ins it_pred:$cc, it_mask:$mask)>,
>           ComplexDeprecationPredicate<"IT">;
> +
> +let mayLoad = 1, mayStore =1, hasSideEffects = 1 in
> +def SPACE : PseudoInst<(outs GPR:$Rd), (ins i32imm:$size, GPR:$Rn),
> +                       NoItinerary,
> +                       [(set GPR:$Rd, (int_arm_space imm:$size, GPR:$Rn))]>;
>
> Added: llvm/trunk/test/CodeGen/ARM/space-directive.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/space-directive.ll?rev=221903&view=auto
> ==============================================================================
> --- llvm/trunk/test/CodeGen/ARM/space-directive.ll (added)
> +++ llvm/trunk/test/CodeGen/ARM/space-directive.ll Thu Nov 13 11:58:48 2014
> @@ -0,0 +1,19 @@
> +; RUN: llc -mtriple=armv7 -o - %s | FileCheck %s
> +
> +define i32 @test_space() minsize {
> +; CHECK-LABEL: test_space:
> +; CHECK: ldr {{r[0-9]+}}, [[CPENTRY:.?LCPI[0-9]+_[0-9]+]]
> +; CHECK: b [[PAST_CP:.?LBB[0-9]+_[0-9]+]]
> +
> +; CHECK: [[CPENTRY]]:
> +; CHECK-NEXT: 12345678
> +
> +; CHECK: [[PAST_CP]]:
> +; CHECK: .zero 10000
> +  %addr = inttoptr i32 12345678 to i32*
> +  %val = load i32* %addr
> +  call i32 @llvm.arm.space(i32 10000, i32 undef)
> +  ret i32 %val
> +}
> +
> +declare i32 @llvm.arm.space(i32, i32)
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list