[llvm-dev] 5.0.1-rc2 has been tagged
Y Song via llvm-dev
llvm-dev at lists.llvm.org
Sat Dec 2 22:44:41 PST 2017
Hi, Tom,
Considering the severity of this bug, I would like to go ahead to push
the fix into release_50 branch. The fix has been tested in the trunk and by
various people as well and I will also make sure all BPF tests passed
before the push.
Thanks!
Yonghong
On Fri, Dec 1, 2017 at 10:18 AM, Y Song <ys114321 at gmail.com> wrote:
> Hi, Tom,
>
> I have a BPF backend bug which is pretty noxious which is introduced
> in 5.0 and fixed in 6.0 trunk.
> The detailed of the backport commit is at the end of this email, which
> is slightly different from
> 6.0 fix to adjust the asm output format. Is there a way for this bug
> fix into 5.0.1 release and if yes,
> what is the process?
>
> I have applied the commit below to latest release_50 branch in my
> local repo and run through all BPF tests
> and they are fine.
>
> Thanks!
>
> Yonghong
>
> ===== Commit to backport Details =====
> commit a115edb82180f0c94d692c4abfd631984ada156b
> Author: Yonghong Song <yhs at fb.com>
> Date: Mon Oct 16 04:14:53 2017 +0000
>
> bpf: fix bug on silently truncating 64-bit immediate
>
> We came across an llvm bug when compiling some testcases that 64-bit
> immediates are silently truncated into 32-bit and then packed into
> BPF_JMP | BPF_K encoding. This caused comparison with wrong value.
>
> This bug looks to be introduced by r308080 (llvm 5.0). The
> Select_Ri pattern is
> supposed to be lowered into J*_Ri while the latter only support 32-bit
> immediate encoding, therefore Select_Ri should have similar immediate
> predicate check as what J*_Ri are doing.
>
> The bug is fixed by
> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@315889
> 91177308-0d34-0410-b5e6-96231b3b80d8
> in llvm 6.0.
>
> This patch is largely the same as the fix in llvm 6.0 except
> one minor adjustment ("; CHECK: r{{[0-9]+}} = 8589934591 ll" in
> the original commit
> to "; CHECK: r{{[0-9]+}} = 8589934591ll" in this patch) for the test case.
>
> Reported-by: John Fastabend <john.fastabend at gmail.com>
> Reported-by: Jakub Kicinski <jakub.kicinski at netronome.com>
> Signed-off-by: Jiong Wang <jiong.wang at netronome.com>
> Reviewed-by: Yonghong Song <yhs at fb.com>
>
> diff --git a/lib/Target/BPF/BPFISelLowering.cpp
> b/lib/Target/BPF/BPFISelLowering.cpp
> index 81b0aa7..5740b49 100644
> --- a/lib/Target/BPF/BPFISelLowering.cpp
> +++ b/lib/Target/BPF/BPFISelLowering.cpp
> @@ -578,11 +578,15 @@
> BPFTargetLowering::EmitInstrWithCustomInserter(MachineInstr &MI,
> .addReg(LHS)
> .addReg(MI.getOperand(2).getReg())
> .addMBB(Copy1MBB);
> - else
> + else {
> + int64_t imm32 = MI.getOperand(2).getImm();
> + // sanity check before we build J*_ri instruction.
> + assert (isInt<32>(imm32));
> BuildMI(BB, DL, TII.get(NewCC))
> .addReg(LHS)
> - .addImm(MI.getOperand(2).getImm())
> + .addImm(imm32)
> .addMBB(Copy1MBB);
> + }
>
> // Copy0MBB:
> // %FalseValue = ...
> diff --git a/lib/Target/BPF/BPFInstrInfo.td b/lib/Target/BPF/BPFInstrInfo.td
> index f683578..56f0f9c 100644
> --- a/lib/Target/BPF/BPFInstrInfo.td
> +++ b/lib/Target/BPF/BPFInstrInfo.td
> @@ -464,7 +464,7 @@ let usesCustomInserter = 1 in {
> (ins GPR:$lhs, i64imm:$rhs, i64imm:$imm,
> GPR:$src, GPR:$src2),
> "# Select PSEUDO $dst = $lhs $imm $rhs ? $src : $src2",
> [(set i64:$dst,
> - (BPFselectcc i64:$lhs, (i64 imm:$rhs), (i64
> imm:$imm), i64:$src, i64:$src2))]>;
> + (BPFselectcc i64:$lhs, (i64immSExt32:$rhs),
> (i64 imm:$imm), i64:$src, i64:$src2))]>;
> }
>
> // load 64-bit global addr into register
> diff --git a/test/CodeGen/BPF/select_ri.ll b/test/CodeGen/BPF/select_ri.ll
> index c4ac376..3610d40 100644
> --- a/test/CodeGen/BPF/select_ri.ll
> +++ b/test/CodeGen/BPF/select_ri.ll
> @@ -25,3 +25,38 @@ entry:
> }
>
> attributes #0 = { norecurse nounwind readonly }
> +
> +; test immediate out of 32-bit range
> +; Source file:
> +
> +; unsigned long long
> +; load_word(void *buf, unsigned long long off)
> +; asm("llvm.bpf.load.word");
> +;
> +; int
> +; foo(void *buf)
> +; {
> +; unsigned long long sum = 0;
> +;
> +; sum += load_word(buf, 100);
> +; sum += load_word(buf, 104);
> +;
> +; if (sum != 0x1ffffffffULL)
> +; return ~0U;
> +;
> +; return 0;
> +;}
> +
> +; Function Attrs: nounwind readonly
> +define i32 @foo(i8*) local_unnamed_addr #0 {
> + %2 = tail call i64 @llvm.bpf.load.word(i8* %0, i64 100)
> + %3 = tail call i64 @llvm.bpf.load.word(i8* %0, i64 104)
> + %4 = add i64 %3, %2
> + %5 = icmp ne i64 %4, 8589934591
> +; CHECK: r{{[0-9]+}} = 8589934591ll
> + %6 = sext i1 %5 to i32
> + ret i32 %6
> +}
> +
> +; Function Attrs: nounwind readonly
> +declare i64 @llvm.bpf.load.word(i8*, i64) #1
>
> On Wed, Nov 29, 2017 at 4:19 PM, Tom Stellard via llvm-dev
> <llvm-dev at lists.llvm.org> wrote:
>> Hi,
>>
>> I've tagged the 5.0.1-rc2 release, go ahead and start testing and report
>> your results.
>>
>> -Tom
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
More information about the llvm-dev
mailing list