1; RUN: llc < %s -march=bpf -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(%struct.xdp_md* nocapture readonly %xdp) local_unnamed_addr #0 { 29entry: 30 %data = getelementptr inbounds %struct.xdp_md, %struct.xdp_md* %xdp, i64 0, i32 0 31 %0 = load i32, i32* %data, align 4 32 %conv = zext i32 %0 to i64 33 %1 = inttoptr i64 %conv to i8* 34 %2 = load i8, i8* %1, align 1 35; CHECK: r1 = *(u32 *)(r1 + 0) 36; CHECK: r1 = *(u8 *)(r1 + 0) 37 %3 = load i32, i32* @gbl, align 4 38 switch i32 %3, label %if.end [ 39 i32 0, label %if.else 40 i32 1, label %cleanup 41 ] 42 43if.end: ; preds = %entry 44 %cmp4 = icmp eq i8 %2, 1 45; CHECK: r0 = 3 46; CHECK-NOT: r1 &= 255 47; CHECK: if r1 == 1 goto 48 br i1 %cmp4, label %cleanup, label %if.end13 49 50if.else: ; preds = %entry 51 %cmp9 = icmp eq i8 %2, 0 52; CHECK: r0 = 2 53; CHECK-NOT: r1 &= 255 54; CHECK: if r1 == 0 goto 55 br i1 %cmp9, label %cleanup, label %if.end13 56 57if.end13: ; preds = %if.else, %if.end 58 br label %cleanup 59 60cleanup: ; preds = %if.else, %if.end, %entry, %if.end13 61 %retval.0 = phi i32 [ 0, %if.end13 ], [ 1, %entry ], [ 3, %if.end ], [ 2, %if.else ] 62 ret i32 %retval.0 63} 64 65attributes #0 = { norecurse nounwind readonly } 66