define ptx_kernel void @main_graph_async_dispatch_3_elementwise_D_i64xi1(ptr addrspace(1) noalias noundef nonnull readonly align 16 %0, ptr addrspace(1) noalias nofree noundef nonnull writeonly align 16 captures(none) %1, i32 noundef %2, i32 noundef %3, i32 noundef %4, i32 noundef %5, i32 noundef %6, i32 noundef %7, i32 noundef %8, i32 noundef %9) local_unnamed_addr #0 { %11 = tail call range(i32 0, 32) i32 @llvm.nvvm.read.ptx.sreg.tid.x() %12 = zext i32 %2 to i64 %13 = zext i32 %3 to i64 %14 = shl nuw i64 %13, 32 %15 = or disjoint i64 %14, %12 %16 = zext i32 %4 to i64 %17 = zext i32 %5 to i64 %18 = shl nuw i64 %17, 32 %19 = zext i32 %8 to i64 %20 = zext i32 %9 to i64 %21 = shl nuw i64 %20, 32 %22 = or disjoint i64 %21, %19 %23 = icmp ult i64 %15, -9223372036854775807 %24 = and i64 %12, 63 %25 = icmp eq i64 %24, 0 tail call void @llvm.assume(i1 %23) tail call void @llvm.assume(i1 %25) %26 = icmp sgt i64 %21, -1 tail call void @llvm.assume(i1 %26) call void @llvm.assume(i1 true) [ "align"(ptr addrspace(1) %0, i64 64) ] %27 = lshr exact i64 %15, 3 %28 = and i64 %27, 288230376151711736 %29 = getelementptr [8 x i8], ptr addrspace(1) %0, i64 %28 call void @llvm.assume(i1 true) [ "align"(ptr addrspace(1) %29, i64 64) ] %.masked = and i64 %18, 2305843004918726656 %30 = getelementptr i8, ptr addrspace(1) %1, i64 %.masked %31 = getelementptr i8, ptr addrspace(1) %30, i64 %16 call void @llvm.assume(i1 true) [ "align"(ptr addrspace(1) %31, i64 64) ] %32 = icmp eq i64 %22, 0 %33 = tail call i64 @llvm.usub.sat.i64(i64 %22, i64 1) %34 = lshr i64 %33, 5 %35 = add nuw nsw i64 %34, 1 %36 = select i1 %32, i64 0, i64 %35 %37 = tail call range(i32 0, 2147483647) i32 @llvm.nvvm.read.ptx.sreg.ctaid.x() %38 = zext nneg i32 %37 to i64 %39 = tail call range(i32 1, -2147483648) i32 @llvm.nvvm.read.ptx.sreg.nctaid.x() %40 = zext nneg i32 %39 to i64 %41 = icmp samesign ugt i64 %36, %38 br i1 %41, label %.lr.ph3, label %._crit_edge4 .lr.ph3: ; preds = %10, %._crit_edge %42 = phi i64 [ %59, %._crit_edge ], [ %38, %10 ] %43 = shl i64 %42, 5 %44 = sub i64 %22, %43 %45 = tail call i64 @llvm.smin.i64(i64 %44, i64 32) %46 = trunc i64 %45 to i32 %47 = icmp slt i32 %11, %46 br i1 %47, label %.lr.ph, label %._crit_edge .lr.ph: ; preds = %.lr.ph3, %.lr.ph %48 = phi i32 [ %57, %.lr.ph ], [ %11, %.lr.ph3 ] %49 = zext i32 %48 to i64 %50 = add i64 %43, %49 %51 = getelementptr [8 x i8], ptr addrspace(1) %29, i64 %50 %52 = load <1 x i64>, ptr addrspace(1) %51, align 8 %53 = getelementptr i8, ptr addrspace(1) %0, <1 x i64> %52 %54 = tail call <1 x i8> @llvm.masked.gather.v1i8.v1p1(<1 x ptr addrspace(1)> align 1 %53, <1 x i1> splat (i1 true), <1 x i8> poison) %55 = and <1 x i8> %54, splat (i8 1) %56 = getelementptr i8, ptr addrspace(1) %31, i64 %50 store <1 x i8> %55, ptr addrspace(1) %56, align 1 %57 = add i32 %48, 32 %58 = icmp slt i32 %57, %46 br i1 %58, label %.lr.ph, label %._crit_edge ._crit_edge: ; preds = %.lr.ph, %.lr.ph3 %59 = add i64 %42, %40 %60 = icmp samesign ult i64 %59, %36 br i1 %60, label %.lr.ph3, label %._crit_edge4 ._crit_edge4: ; preds = %._crit_edge, %10 ret void }