325 lines · plain
1; RUN: llc < %s -mtriple=bpfel -mcpu=v1 -show-mc-encoding | FileCheck %s2 3%struct.bpf_map_def = type { i32, i32, i32, i32 }4%struct.sk_buff = type opaque5 6@hash_map = global %struct.bpf_map_def { i32 1, i32 4, i32 8, i32 1024 }, section "maps", align 47 8; Function Attrs: nounwind uwtable9define i32 @bpf_prog2(ptr %skb) #0 section "socket2" {10 %key = alloca i32, align 411 %val = alloca i64, align 812 %1 = bitcast ptr %skb to ptr13 %2 = call i64 @llvm.bpf.load.half(ptr %1, i64 12) #214 %3 = icmp eq i64 %2, 3498415 br i1 %3, label %4, label %616 17; <label>:4 ; preds = %018 %5 = call i64 @llvm.bpf.load.half(ptr %1, i64 16) #219 br label %620 21; <label>:6 ; preds = %4, %022 %proto.0.i = phi i64 [ %5, %4 ], [ %2, %0 ]23 %nhoff.0.i = phi i64 [ 18, %4 ], [ 14, %0 ]24 %7 = icmp eq i64 %proto.0.i, 3302425 br i1 %7, label %8, label %1226 27; <label>:8 ; preds = %628 %9 = add i64 %nhoff.0.i, 229 %10 = call i64 @llvm.bpf.load.half(ptr %1, i64 %9) #230 %11 = add i64 %nhoff.0.i, 431 br label %1232 33; <label>:12 ; preds = %8, %634 %proto.1.i = phi i64 [ %10, %8 ], [ %proto.0.i, %6 ]35 %nhoff.1.i = phi i64 [ %11, %8 ], [ %nhoff.0.i, %6 ]36 switch i64 %proto.1.i, label %flow_dissector.exit.thread [37 i64 2048, label %1338 i64 34525, label %3939 ]40 41; <label>:13 ; preds = %1242 %14 = add i64 %nhoff.1.i, 643 %15 = call i64 @llvm.bpf.load.half(ptr %1, i64 %14) #244 %16 = and i64 %15, 1638345 %17 = icmp eq i64 %16, 046 br i1 %17, label %18, label %.thread.i.i47 48; <label>:18 ; preds = %1349 %19 = add i64 %nhoff.1.i, 950 %20 = call i64 @llvm.bpf.load.byte(ptr %1, i64 %19) #251 %21 = icmp eq i64 %20, 4752 br i1 %21, label %28, label %.thread.i.i53 54.thread.i.i: ; preds = %18, %1355 %22 = phi i64 [ %20, %18 ], [ 0, %13 ]56 %23 = add i64 %nhoff.1.i, 1257 %24 = call i64 @llvm.bpf.load.word(ptr %1, i64 %23) #258 %25 = add i64 %nhoff.1.i, 1659 %26 = call i64 @llvm.bpf.load.word(ptr %1, i64 %25) #260 %27 = trunc i64 %26 to i3261 br label %2862 63; <label>:28 ; preds = %.thread.i.i, %1864 %29 = phi i32 [ %27, %.thread.i.i ], [ undef, %18 ]65 %30 = phi i64 [ %22, %.thread.i.i ], [ 47, %18 ]66 %31 = call i64 @llvm.bpf.load.byte(ptr %1, i64 %nhoff.1.i) #267 %32 = icmp eq i64 %31, 6968 br i1 %32, label %33, label %3569 70; <label>:33 ; preds = %2871 %34 = add i64 %nhoff.1.i, 2072 br label %parse_ip.exit.i73 74; <label>:35 ; preds = %2875 %36 = shl i64 %31, 276 %37 = and i64 %36, 6077 %38 = add i64 %37, %nhoff.1.i78 br label %parse_ip.exit.i79 80; <label>:39 ; preds = %1281 %40 = add i64 %nhoff.1.i, 682 %41 = call i64 @llvm.bpf.load.byte(ptr %1, i64 %40) #283 %42 = add i64 %nhoff.1.i, 884 %43 = call i64 @llvm.bpf.load.word(ptr %1, i64 %42) #285 %44 = add i64 %nhoff.1.i, 1286 %45 = call i64 @llvm.bpf.load.word(ptr %1, i64 %44) #287 %46 = add i64 %nhoff.1.i, 1688 %47 = call i64 @llvm.bpf.load.word(ptr %1, i64 %46) #289 %48 = add i64 %nhoff.1.i, 2090 %49 = call i64 @llvm.bpf.load.word(ptr %1, i64 %48) #291 %50 = add i64 %nhoff.1.i, 2492 %51 = call i64 @llvm.bpf.load.word(ptr %1, i64 %50) #293 %52 = add i64 %nhoff.1.i, 2894 %53 = call i64 @llvm.bpf.load.word(ptr %1, i64 %52) #295 %54 = add i64 %nhoff.1.i, 3296 %55 = call i64 @llvm.bpf.load.word(ptr %1, i64 %54) #297 %56 = add i64 %nhoff.1.i, 3698 %57 = call i64 @llvm.bpf.load.word(ptr %1, i64 %56) #299 %58 = xor i64 %53, %51100 %59 = xor i64 %58, %55101 %60 = xor i64 %59, %57102 %61 = trunc i64 %60 to i32103 %62 = add i64 %nhoff.1.i, 40104 br label %parse_ip.exit.i105 106parse_ip.exit.i: ; preds = %39, %35, %33107 %63 = phi i32 [ %61, %39 ], [ %29, %33 ], [ %29, %35 ]108 %64 = phi i64 [ %41, %39 ], [ %30, %33 ], [ %30, %35 ]109 %nhoff.2.i = phi i64 [ %62, %39 ], [ %34, %33 ], [ %38, %35 ]110 switch i64 %64, label %187 [111 i64 47, label %65112 i64 4, label %137113 i64 41, label %163114 ]115 116; <label>:65 ; preds = %parse_ip.exit.i117 %66 = call i64 @llvm.bpf.load.half(ptr %1, i64 %nhoff.2.i) #2118 %67 = add i64 %nhoff.2.i, 2119 %68 = call i64 @llvm.bpf.load.half(ptr %1, i64 %67) #2120 %69 = and i64 %66, 1856121 %70 = icmp eq i64 %69, 0122 br i1 %70, label %71, label %187123 124; <label>:71 ; preds = %65125 %72 = lshr i64 %66, 5126 %73 = and i64 %72, 4127 %74 = add i64 %nhoff.2.i, 4128 %..i = add i64 %74, %73129 %75 = and i64 %66, 32130 %76 = icmp eq i64 %75, 0131 %77 = add i64 %..i, 4132 %nhoff.4.i = select i1 %76, i64 %..i, i64 %77133 %78 = and i64 %66, 16134 %79 = icmp eq i64 %78, 0135 %80 = add i64 %nhoff.4.i, 4136 %nhoff.4..i = select i1 %79, i64 %nhoff.4.i, i64 %80137 %81 = icmp eq i64 %68, 33024138 br i1 %81, label %82, label %86139 140; <label>:82 ; preds = %71141 %83 = add i64 %nhoff.4..i, 2142 %84 = call i64 @llvm.bpf.load.half(ptr %1, i64 %83) #2143 %85 = add i64 %nhoff.4..i, 4144 br label %86145 146; <label>:86 ; preds = %82, %71147 %proto.2.i = phi i64 [ %84, %82 ], [ %68, %71 ]148 %nhoff.6.i = phi i64 [ %85, %82 ], [ %nhoff.4..i, %71 ]149 switch i64 %proto.2.i, label %flow_dissector.exit.thread [150 i64 2048, label %87151 i64 34525, label %113152 ]153 154; <label>:87 ; preds = %86155 %88 = add i64 %nhoff.6.i, 6156 %89 = call i64 @llvm.bpf.load.half(ptr %1, i64 %88) #2157 %90 = and i64 %89, 16383158 %91 = icmp eq i64 %90, 0159 br i1 %91, label %92, label %.thread.i4.i160 161; <label>:92 ; preds = %87162 %93 = add i64 %nhoff.6.i, 9163 %94 = call i64 @llvm.bpf.load.byte(ptr %1, i64 %93) #2164 %95 = icmp eq i64 %94, 47165 br i1 %95, label %102, label %.thread.i4.i166 167.thread.i4.i: ; preds = %92, %87168 %96 = phi i64 [ %94, %92 ], [ 0, %87 ]169 %97 = add i64 %nhoff.6.i, 12170 %98 = call i64 @llvm.bpf.load.word(ptr %1, i64 %97) #2171 %99 = add i64 %nhoff.6.i, 16172 %100 = call i64 @llvm.bpf.load.word(ptr %1, i64 %99) #2173 %101 = trunc i64 %100 to i32174 br label %102175 176; <label>:102 ; preds = %.thread.i4.i, %92177 %103 = phi i32 [ %101, %.thread.i4.i ], [ %63, %92 ]178 %104 = phi i64 [ %96, %.thread.i4.i ], [ 47, %92 ]179 %105 = call i64 @llvm.bpf.load.byte(ptr %1, i64 %nhoff.6.i) #2180 %106 = icmp eq i64 %105, 69181 br i1 %106, label %107, label %109182 183; <label>:107 ; preds = %102184 %108 = add i64 %nhoff.6.i, 20185 br label %187186 187; <label>:109 ; preds = %102188 %110 = shl i64 %105, 2189 %111 = and i64 %110, 60190 %112 = add i64 %111, %nhoff.6.i191 br label %187192 193; <label>:113 ; preds = %86194 %114 = add i64 %nhoff.6.i, 6195 %115 = call i64 @llvm.bpf.load.byte(ptr %1, i64 %114) #2196 %116 = add i64 %nhoff.6.i, 8197 %117 = call i64 @llvm.bpf.load.word(ptr %1, i64 %116) #2198 %118 = add i64 %nhoff.6.i, 12199 %119 = call i64 @llvm.bpf.load.word(ptr %1, i64 %118) #2200 %120 = add i64 %nhoff.6.i, 16201 %121 = call i64 @llvm.bpf.load.word(ptr %1, i64 %120) #2202 %122 = add i64 %nhoff.6.i, 20203 %123 = call i64 @llvm.bpf.load.word(ptr %1, i64 %122) #2204 %124 = add i64 %nhoff.6.i, 24205 %125 = call i64 @llvm.bpf.load.word(ptr %1, i64 %124) #2206 %126 = add i64 %nhoff.6.i, 28207 %127 = call i64 @llvm.bpf.load.word(ptr %1, i64 %126) #2208 %128 = add i64 %nhoff.6.i, 32209 %129 = call i64 @llvm.bpf.load.word(ptr %1, i64 %128) #2210 %130 = add i64 %nhoff.6.i, 36211 %131 = call i64 @llvm.bpf.load.word(ptr %1, i64 %130) #2212 %132 = xor i64 %127, %125213 %133 = xor i64 %132, %129214 %134 = xor i64 %133, %131215 %135 = trunc i64 %134 to i32216 %136 = add i64 %nhoff.6.i, 40217 br label %187218 219; <label>:137 ; preds = %parse_ip.exit.i220 %138 = add i64 %nhoff.2.i, 6221 %139 = call i64 @llvm.bpf.load.half(ptr %1, i64 %138) #2222 %140 = and i64 %139, 16383223 %141 = icmp eq i64 %140, 0224 br i1 %141, label %142, label %.thread.i1.i225 226; <label>:142 ; preds = %137227 %143 = add i64 %nhoff.2.i, 9228 %144 = call i64 @llvm.bpf.load.byte(ptr %1, i64 %143) #2229 %145 = icmp eq i64 %144, 47230 br i1 %145, label %152, label %.thread.i1.i231 232.thread.i1.i: ; preds = %142, %137233 %146 = phi i64 [ %144, %142 ], [ 0, %137 ]234 %147 = add i64 %nhoff.2.i, 12235 %148 = call i64 @llvm.bpf.load.word(ptr %1, i64 %147) #2236 %149 = add i64 %nhoff.2.i, 16237 %150 = call i64 @llvm.bpf.load.word(ptr %1, i64 %149) #2238 %151 = trunc i64 %150 to i32239 br label %152240 241; <label>:152 ; preds = %.thread.i1.i, %142242 %153 = phi i32 [ %151, %.thread.i1.i ], [ %63, %142 ]243 %154 = phi i64 [ %146, %.thread.i1.i ], [ 47, %142 ]244 %155 = call i64 @llvm.bpf.load.byte(ptr %1, i64 %nhoff.2.i) #2245 %156 = icmp eq i64 %155, 69246 br i1 %156, label %157, label %159247 248; <label>:157 ; preds = %152249 %158 = add i64 %nhoff.2.i, 20250 br label %187251 252; <label>:159 ; preds = %152253 %160 = shl i64 %155, 2254 %161 = and i64 %160, 60255 %162 = add i64 %161, %nhoff.2.i256 br label %187257 258; <label>:163 ; preds = %parse_ip.exit.i259 %164 = add i64 %nhoff.2.i, 6260 %165 = call i64 @llvm.bpf.load.byte(ptr %1, i64 %164) #2261 %166 = add i64 %nhoff.2.i, 8262 %167 = call i64 @llvm.bpf.load.word(ptr %1, i64 %166) #2263 %168 = add i64 %nhoff.2.i, 12264 %169 = call i64 @llvm.bpf.load.word(ptr %1, i64 %168) #2265 %170 = add i64 %nhoff.2.i, 16266 %171 = call i64 @llvm.bpf.load.word(ptr %1, i64 %170) #2267 %172 = add i64 %nhoff.2.i, 20268 %173 = call i64 @llvm.bpf.load.word(ptr %1, i64 %172) #2269 %174 = add i64 %nhoff.2.i, 24270 %175 = call i64 @llvm.bpf.load.word(ptr %1, i64 %174) #2271 %176 = add i64 %nhoff.2.i, 28272 %177 = call i64 @llvm.bpf.load.word(ptr %1, i64 %176) #2273 %178 = add i64 %nhoff.2.i, 32274 %179 = call i64 @llvm.bpf.load.word(ptr %1, i64 %178) #2275 %180 = add i64 %nhoff.2.i, 36276 %181 = call i64 @llvm.bpf.load.word(ptr %1, i64 %180) #2277 %182 = xor i64 %177, %175278 %183 = xor i64 %182, %179279 %184 = xor i64 %183, %181280 %185 = trunc i64 %184 to i32281 %186 = add i64 %nhoff.2.i, 40282 br label %187283 284; <label>:187 ; preds = %163, %159, %157, %113, %109, %107, %65, %parse_ip.exit.i285 %188 = phi i32 [ %63, %parse_ip.exit.i ], [ %185, %163 ], [ %63, %65 ], [ %135, %113 ], [ %103, %107 ], [ %103, %109 ], [ %153, %157 ], [ %153, %159 ]286 %189 = phi i64 [ %64, %parse_ip.exit.i ], [ %165, %163 ], [ 47, %65 ], [ %115, %113 ], [ %104, %107 ], [ %104, %109 ], [ %154, %157 ], [ %154, %159 ]287 %nhoff.7.i = phi i64 [ %nhoff.2.i, %parse_ip.exit.i ], [ %186, %163 ], [ %nhoff.2.i, %65 ], [ %136, %113 ], [ %108, %107 ], [ %112, %109 ], [ %158, %157 ], [ %162, %159 ]288 %cond.i.i = icmp eq i64 %189, 51289 %190 = select i1 %cond.i.i, i64 4, i64 0290 %191 = add i64 %190, %nhoff.7.i291 %192 = call i64 @llvm.bpf.load.word(ptr %1, i64 %191) #2292 store i32 %188, ptr %key, align 4293 %193 = bitcast ptr %key to ptr294 %194 = call ptr inttoptr (i64 1 to ptr)(ptr @hash_map, ptr %193) #2295 %195 = icmp eq ptr %194, null296 br i1 %195, label %199, label %196297 298; <label>:196 ; preds = %187299 %197 = bitcast ptr %194 to ptr300 %198 = atomicrmw add ptr %197, i64 1 seq_cst301 br label %flow_dissector.exit.thread302 303; <label>:199 ; preds = %187304 store i64 1, ptr %val, align 8305 %200 = bitcast ptr %val to ptr306 %201 = call i32 inttoptr (i64 2 to ptr)(ptr @hash_map, ptr %193, ptr %200, i64 0) #2307 br label %flow_dissector.exit.thread308 309flow_dissector.exit.thread: ; preds = %86, %12, %196, %199310 ret i32 0311; CHECK-LABEL: bpf_prog2:312; CHECK: r0 = *(u16 *)skb[12] # encoding: [0x28,0x00,0x00,0x00,0x0c,0x00,0x00,0x00]313; CHECK: r0 = *(u16 *)skb[16] # encoding: [0x28,0x00,0x00,0x00,0x10,0x00,0x00,0x00]314; CHECK: implicit-def: $r7315; CHECK: r1 =316; CHECK: call 1 # encoding: [0x85,0x00,0x00,0x00,0x01,0x00,0x00,0x00]317; CHECK: call 2 # encoding: [0x85,0x00,0x00,0x00,0x02,0x00,0x00,0x00]318}319 320declare i64 @llvm.bpf.load.half(ptr, i64) #1321 322declare i64 @llvm.bpf.load.word(ptr, i64) #1323 324declare i64 @llvm.bpf.load.byte(ptr, i64) #1325