Previously, PrivateLabelPrefix was default-initialized to "L", so basic block labels were added to the symbol table. This seems like an oversight, so use ".L" for all private labels.
92 lines
3.0 KiB
LLVM
92 lines
3.0 KiB
LLVM
; RUN: llc -mtriple=bpfel -mcpu=v4 -gotol-abs-low-bound 0 -verify-machineinstrs -show-mc-encoding < %s | FileCheck %s
|
|
; Source:
|
|
; // This test covers all three cases:
|
|
; // (1). jmp to another basic block (not the follow-through one)
|
|
; // (2). conditional jmp (follow-through and non-follow-through)
|
|
; // (3). conditional jmp followed by an unconditional jmp
|
|
; // To trigger case (3) the following code is developed which
|
|
; // covers case (1) and (2) as well.
|
|
; unsigned foo(unsigned a, unsigned b) {
|
|
; unsigned s = b;
|
|
; if (a < b)
|
|
; goto next;
|
|
; else
|
|
; goto next2;
|
|
; begin:
|
|
; s /= b;
|
|
; if (s > a)
|
|
; return s * s;
|
|
; next:
|
|
; s *= a;
|
|
; if (s > b)
|
|
; goto begin;
|
|
; next2:
|
|
; s *= b;
|
|
; if (s > a)
|
|
; goto begin;
|
|
; return s;
|
|
; }
|
|
; Compilation flags:
|
|
; clang -target bpf -O2 -mcpu=v4 -S -emit-llvm t.c
|
|
|
|
; Function Attrs: nofree norecurse nosync nounwind memory(none)
|
|
define dso_local i32 @foo(i32 noundef %a, i32 noundef %b) local_unnamed_addr #0 {
|
|
entry:
|
|
%cmp = icmp ult i32 %a, %b
|
|
br i1 %cmp, label %next, label %next2
|
|
|
|
; case (3): conditional jmp followed by an unconditional jmp
|
|
; CHECK: w0 = w2
|
|
; CHECK-NEXT: if w1 < w2 goto
|
|
; CHECK: gotol .LBB0_4 # encoding: [0x06'A',A,A,A,0x00,0x00,0x00,0x00]
|
|
; CHECK-NEXT: # fixup A - offset: 0, value: .LBB0_4, kind: FK_BPF_PCRel_4
|
|
|
|
begin: ; preds = %next2, %next
|
|
%s.0 = phi i32 [ %mul3, %next ], [ %mul7, %next2 ]
|
|
%div = udiv i32 %s.0, %b
|
|
%cmp1 = icmp ugt i32 %div, %a
|
|
br i1 %cmp1, label %if.then2, label %next
|
|
|
|
; case (2): conditional jmp
|
|
; CHECK: w0 *= w1
|
|
; CHECK-NEXT: if w0 > w2 goto .LBB0_7
|
|
; CHECK: goto .LBB0_4
|
|
; CHECK-LABEL: .LBB0_7:
|
|
; CHECK: gotol
|
|
|
|
; CHECK-LABEL: .LBB0_4:
|
|
|
|
if.then2: ; preds = %begin
|
|
%mul = mul i32 %div, %div
|
|
br label %cleanup
|
|
|
|
; case (1): unconditional jmp
|
|
; CHECK: w0 *= w0
|
|
; CHECK-NEXT: gotol
|
|
|
|
next: ; preds = %begin, %entry
|
|
%s.1 = phi i32 [ %b, %entry ], [ %div, %begin ]
|
|
%mul3 = mul i32 %s.1, %a
|
|
%cmp4 = icmp ugt i32 %mul3, %b
|
|
br i1 %cmp4, label %begin, label %next2
|
|
|
|
next2: ; preds = %next, %entry
|
|
%s.2 = phi i32 [ %mul3, %next ], [ %b, %entry ]
|
|
%mul7 = mul i32 %s.2, %b
|
|
%cmp8 = icmp ugt i32 %mul7, %a
|
|
br i1 %cmp8, label %begin, label %cleanup
|
|
|
|
cleanup: ; preds = %next2, %if.then2
|
|
%retval.0 = phi i32 [ %mul, %if.then2 ], [ %mul7, %next2 ]
|
|
ret i32 %retval.0
|
|
}
|
|
|
|
attributes #0 = { nofree norecurse nosync nounwind memory(none) "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="v4" }
|
|
|
|
!llvm.module.flags = !{!0, !1}
|
|
!llvm.ident = !{!2}
|
|
|
|
!0 = !{i32 1, !"wchar_size", i32 4}
|
|
!1 = !{i32 7, !"frame-pointer", i32 2}
|
|
!2 = !{!"clang version 18.0.0 (https://github.com/llvm/llvm-project.git dccf0f74657ce8c50eb1e997bae356c32d7b1ffe)"}
|