diff --git a/llvm/test/Transforms/GVN/no_speculative_loads_with_asan.ll b/llvm/test/Transforms/GVN/no_speculative_loads_with_asan.ll --- a/llvm/test/Transforms/GVN/no_speculative_loads_with_asan.ll +++ b/llvm/test/Transforms/GVN/no_speculative_loads_with_asan.ll @@ -118,3 +118,124 @@ %i11 = phi i32 [ %i9, %bb5 ], [ 0, %bb ] ret i32 %i11 } + +%struct.sockaddr_in = type { i32 } + +@compare_netdev_and_ip_sb_0 = dso_local global i32 0, align 4 +@ipv6_addr_cmp_a1 = dso_local global ptr null, align 8 +@ipv6_addr_cmp_a2 = dso_local global %struct.sockaddr_in zeroinitializer, align 4 +@compare_netdev_and_ip___trans_tmp_1 = dso_local global i32 0, align 4 +@node_from_ndev_ip_root_0 = dso_local global i32 0, align 4 +@node_from_ndev_ip_data = dso_local global i32 0, align 4 +@cma_netevent_callback_neigh = dso_local global i32 0, align 4 + +declare dso_local i32 @_Z6memcmpPvS_m(ptr noundef, ptr noundef, i64 noundef) + +; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none) +declare i64 @llvm.objectsize.i64.p0(ptr, i1 immarg, i1 immarg, i1 immarg) #0 + +declare void @__read_overflow(...) #1 + +declare void @fortify_panic() #2 + +declare i32 @memcmp(ptr noundef, ptr noundef, i64 noundef) #2 + +define dso_local i32 @cma_netevent_callback() sanitize_address { +; CHECK-LABEL: @cma_netevent_callback( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[RETVAL_I_I:%.*]] = alloca i32, align 4 +; CHECK-NEXT: [[SA_ADDR_I_I:%.*]] = alloca ptr, align 8 +; CHECK-NEXT: [[SA_ADDR_I:%.*]] = alloca ptr, align 8 +; CHECK-NEXT: [[NEIGH_SOCK_4:%.*]] = alloca [[STRUCT_SOCKADDR_IN:%.*]], align 4 +; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr @cma_netevent_callback_neigh, align 4 +; CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP0]], 0 +; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] +; CHECK: if.then: +; CHECK-NEXT: store ptr [[NEIGH_SOCK_4]], ptr [[SA_ADDR_I]], align 8 +; CHECK-NEXT: br label [[WHILE_COND_I:%.*]] +; CHECK: while.cond.i: +; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @node_from_ndev_ip_root_0, align 4 +; CHECK-NEXT: [[TOBOOL_I:%.*]] = icmp ne i32 [[TMP1]], 0 +; CHECK-NEXT: br i1 [[TOBOOL_I]], label [[WHILE_BODY_I:%.*]], label [[NODE_FROM_NDEV_IP_EXIT:%.*]] +; CHECK: while.body.i: +; CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[SA_ADDR_I]], align 8 +; CHECK-NEXT: store ptr [[TMP2]], ptr [[SA_ADDR_I_I]], align 8 +; CHECK-NEXT: [[TMP3:%.*]] = load i16, ptr [[TMP2]], align 2 +; CHECK-NEXT: [[TOBOOL_I_I:%.*]] = icmp ne i16 [[TMP3]], 0 +; CHECK-NEXT: br i1 [[TOBOOL_I_I]], label [[IF_THEN_I_I:%.*]], label [[IF_END_I_I:%.*]] +; CHECK: if.then.i.i: +; CHECK-NEXT: [[TMP4:%.*]] = load ptr, ptr [[SA_ADDR_I_I]], align 8 +; CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 4 +; CHECK-NEXT: [[CONV_I_I:%.*]] = sext i32 [[TMP5]] to i64 +; CHECK-NEXT: [[CALL_I_I:%.*]] = call i32 @_Z6memcmpPvS_m(ptr noundef [[TMP4]], ptr noundef @compare_netdev_and_ip_sb_0, i64 noundef [[CONV_I_I]]) +; CHECK-NEXT: store i32 [[CALL_I_I]], ptr [[RETVAL_I_I]], align 4 +; CHECK-NEXT: br label [[COMPARE_NETDEV_AND_IP_EXIT_I:%.*]] +; CHECK: if.end.i.i: +; CHECK-NEXT: [[TMP6:%.*]] = load ptr, ptr @ipv6_addr_cmp_a1, align 8 +; CHECK-NEXT: [[CALL2_I_I:%.*]] = call i32 @_Z6memcmpPvS_m(ptr noundef [[TMP6]], ptr noundef @ipv6_addr_cmp_a2, i64 noundef 4) +; CHECK-NEXT: store i32 [[CALL2_I_I]], ptr @compare_netdev_and_ip___trans_tmp_1, align 4 +; CHECK-NEXT: store i32 [[CALL2_I_I]], ptr [[RETVAL_I_I]], align 4 +; CHECK-NEXT: br label [[COMPARE_NETDEV_AND_IP_EXIT_I]] +; CHECK: compare_netdev_and_ip.exit.i: +; CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[RETVAL_I_I]], align 4 +; CHECK-NEXT: store i32 [[TMP7]], ptr @node_from_ndev_ip_data, align 4 +; CHECK-NEXT: br label [[WHILE_COND_I]] +; CHECK: node_from_ndev_ip.exit: +; CHECK-NEXT: br label [[IF_END]] +; CHECK: if.end: +; CHECK-NEXT: ret i32 0 +; +entry: + %retval.i.i = alloca i32, align 4 + %sa.addr.i.i = alloca ptr, align 8 + %sa.addr.i = alloca ptr, align 8 + %neigh_sock_4 = alloca %struct.sockaddr_in, align 4 + %0 = load i32, ptr @cma_netevent_callback_neigh, align 4 + %tobool = icmp ne i32 %0, 0 + br i1 %tobool, label %if.then, label %if.end + +if.then: ; preds = %entry + store ptr %neigh_sock_4, ptr %sa.addr.i, align 8 + br label %while.cond.i + +while.cond.i: ; preds = %compare_netdev_and_ip.exit.i, %if.then + %1 = load i32, ptr @node_from_ndev_ip_root_0, align 4 + %tobool.i = icmp ne i32 %1, 0 + br i1 %tobool.i, label %while.body.i, label %node_from_ndev_ip.exit + +while.body.i: ; preds = %while.cond.i + %2 = load ptr, ptr %sa.addr.i, align 8 + store ptr %2, ptr %sa.addr.i.i, align 8 + %3 = load ptr, ptr %sa.addr.i.i, align 8 + %4 = load i16, ptr %3, align 2 + %tobool.i.i = icmp ne i16 %4, 0 + br i1 %tobool.i.i, label %if.then.i.i, label %if.end.i.i + +if.then.i.i: ; preds = %while.body.i + %5 = load ptr, ptr %sa.addr.i.i, align 8 + %6 = load ptr, ptr %sa.addr.i.i, align 8 + %7 = load i32, ptr %6, align 4 + %conv.i.i = sext i32 %7 to i64 + %call.i.i = call i32 @_Z6memcmpPvS_m(ptr noundef %5, ptr noundef @compare_netdev_and_ip_sb_0, i64 noundef %conv.i.i) + store i32 %call.i.i, ptr %retval.i.i, align 4 + br label %compare_netdev_and_ip.exit.i + +if.end.i.i: ; preds = %while.body.i + %8 = load ptr, ptr @ipv6_addr_cmp_a1, align 8 + %call2.i.i = call i32 @_Z6memcmpPvS_m(ptr noundef %8, ptr noundef @ipv6_addr_cmp_a2, i64 noundef 4) + store i32 %call2.i.i, ptr @compare_netdev_and_ip___trans_tmp_1, align 4 + %9 = load i32, ptr @compare_netdev_and_ip___trans_tmp_1, align 4 + store i32 %9, ptr %retval.i.i, align 4 + br label %compare_netdev_and_ip.exit.i + +compare_netdev_and_ip.exit.i: ; preds = %if.end.i.i, %if.then.i.i + %10 = load i32, ptr %retval.i.i, align 4 + store i32 %10, ptr @node_from_ndev_ip_data, align 4 + br label %while.cond.i + +node_from_ndev_ip.exit: ; preds = %while.cond.i + br label %if.end + +if.end: ; preds = %node_from_ndev_ip.exit, %entry + ret i32 0 +}