[llvm-dev] Instruction itineraries and fence/barrier instructions
Matt Arsenault via llvm-dev
llvm-dev at lists.llvm.org
Mon Aug 22 11:40:14 PDT 2016
> On Aug 22, 2016, at 11:20, Phil Tomson via llvm-dev <llvm-dev at lists.llvm.org> wrote:
>
> We improved our instruction itineraries and now we're seeing our testcases for fence instructions break.
>
> For example, we have this testcase:
>
> @write_me = external global i32
> @read_me = external global i32
>
> ; Function Attrs: nounwind
> define i32 @xstg_intrinsic(i32 %foo) #0 {
> entry:
> ; CHECK: store r0, r1, 0, 32
> ; CHECK-NEXT: fence 2
> %foo.addr = alloca i32, align 4
> store i32 %foo, i32* %foo.addr, align 4
> %0 = load i32* %foo.addr, align 4
> store volatile i32 %0, i32* @write_me, align 4
> call void @llvm.xstg.memory.barrier(i32 2, i8 0)
> %1 = load volatile i32* @read_me, align 4
> ret i32 %1
> }
>
> Prior to adding our instruction itineraries the code generated was:
>
> xstg_intrinsic: # @xstg_intrinsic
> # BB#0: # %entry
> subI r509, r509, 16, 64
> store r510, r509, 0, 64
> bitop1 r510, r509, 0, OR, 64
> store r0, r510, 12, 32
> movimm r1, %hi(write_me), 64
> movimmshf32 r1, r1, %lo(write_me)
> store r0, r1, 0, 32
> fence 2
> movimm r0, %hi(read_me), 64
> movimmshf32 r0, r0, %lo(read_me)
> load r1, r0, 0, 32
> bitop1 r509, r510, 0, OR, 64
> load r510, r509, 0, 64
> addI r509, r509, 16, 64
> jabs r511
>
> Note the separation between the store prior to the fence and the code that comes after.
>
> Now that we've got itineraries in place we see:
>
> subI r509, r509, 16, 64
> store r510, r509, 0, 64
> bitop1 r510, r509, 0, OR, 64
> movimm r1, %hi(write_me), 64
> store r0, r510, 12, 32
> movimmshf32 r1, r1, %lo(write_me)
> movimm r2, %hi(read_me), 64
> store r0, r1, 0, 32
> movimmshf32 r2, r2, %lo(read_me)
> fence 2
> load r1, r2, 0, 32
> bitop1 r509, r510, 0, OR, 64
> load r510, r509, 0, 64
> addI r509, r509, 16, 64
> jabs r511
>
> the movimm which sets up the address for the load has been moved up prior to the fence.
>
> Is there a way to indicate in the itinerary that position of the fence should be fixed - no instruction reordering "through" the fence/barrier?
>
> Phil
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
I don’t see a change relative to the memory instructions. Do you mean you want this to avoid scheduling of any instruction around any other? Does the instruction have isSideEffects set on it? I think the fallback if that isn’t enough is to override TargetInstrInfo::isSchedulingBoundary
-Matt
More information about the llvm-dev
mailing list