1; RUN: llc < %s -mtriple=bpf -mcpu=v1 -verify-machineinstrs | FileCheck %s 2 3; Source code: 4; struct xdp_md { 5; unsigned data; 6; unsigned data_end; 7; }; 8; 9; int gbl; 10; int xdp_dummy(struct xdp_md *xdp) 11; { 12; char addr = *(char *)(long)xdp->data; 13; if (gbl) { 14; if (gbl == 1) 15; return 1; 16; if (addr == 1) 17; return 3; 18; } else if (addr == 0) 19; return 2; 20; return 0; 21; } 22 23%struct.xdp_md = type { i32, i32 } 24 25@gbl = common local_unnamed_addr global i32 0, align 4 26 27; Function Attrs: norecurse nounwind readonly 28define i32 @xdp_dummy(ptr nocapture readonly %xdp) local_unnamed_addr #0 { 29entry: 30 %0 = load i32, ptr %xdp, align 4 31 %conv = zext i32 %0 to i64 32 %1 = inttoptr i64 %conv to ptr 33 %2 = load i8, ptr %1, align 1 34; CHECK: r1 = *(u32 *)(r1 + 0) 35; CHECK: r1 = *(u8 *)(r1 + 0) 36 %3 = load i32, ptr @gbl, align 4 37 switch i32 %3, label %if.end [ 38 i32 0, label %if.else 39 i32 1, label %cleanup 40 ] 41 42if.end: ; preds = %entry 43 %cmp4 = icmp eq i8 %2, 1 44; CHECK: r0 = 3 45; CHECK-NOT: r1 &= 255 46; CHECK: if r1 == 1 goto 47 br i1 %cmp4, label %cleanup, label %if.end13 48 49if.else: ; preds = %entry 50 %cmp9 = icmp eq i8 %2, 0 51; CHECK: r0 = 2 52; CHECK-NOT: r1 &= 255 53; CHECK: if r1 == 0 goto 54 br i1 %cmp9, label %cleanup, label %if.end13 55 56if.end13: ; preds = %if.else, %if.end 57 br label %cleanup 58 59cleanup: ; preds = %if.else, %if.end, %entry, %if.end13 60 %retval.0 = phi i32 [ 0, %if.end13 ], [ 1, %entry ], [ 3, %if.end ], [ 2, %if.else ] 61 ret i32 %retval.0 62} 63 64attributes #0 = { norecurse nounwind readonly } 65