63 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -S -passes='move-auto-init' -verify-memoryssa | FileCheck %s3 4; Checks that auto-init memory isntruction are mot moved when writing to an sret argument.5 6target datalayout = "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-f64:32:64-f80:32-n8:16:32-S128"7 8%struct.S = type { i64 }9 10@pattern = private unnamed_addr constant %struct.S { i64 -1 }, align 411 12define void @f(ptr noalias sret(%struct.S) align 4 %0, i32 noundef %1) {13; CHECK-LABEL: @f(14; CHECK-NEXT: [[TMP3:%.*]] = alloca ptr, align 415; CHECK-NEXT: [[TMP4:%.*]] = alloca i32, align 416; CHECK-NEXT: [[TMP5:%.*]] = alloca [[STRUCT_S:%.*]], align 417; CHECK-NEXT: [[TMP6:%.*]] = bitcast ptr [[TMP0:%.*]] to ptr18; CHECK-NEXT: store ptr [[TMP6]], ptr [[TMP3]], align 419; CHECK-NEXT: store i32 [[TMP1:%.*]], ptr [[TMP4]], align 420; CHECK-NEXT: [[TMP7:%.*]] = bitcast ptr [[TMP0]] to ptr21; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[TMP7]], ptr align 4 @pattern, i32 8, i1 false), !annotation !022; CHECK-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP4]], align 423; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], 4224; CHECK-NEXT: br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP13:%.*]]25; CHECK: 10:26; CHECK-NEXT: call void @g(ptr sret([[STRUCT_S]]) align 4 [[TMP5]])27; CHECK-NEXT: [[TMP11:%.*]] = bitcast ptr [[TMP0]] to ptr28; CHECK-NEXT: [[TMP12:%.*]] = bitcast ptr [[TMP5]] to ptr29; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[TMP11]], ptr align 4 [[TMP12]], i32 8, i1 false)30; CHECK-NEXT: br label [[TMP13]]31; CHECK: 13:32; CHECK-NEXT: ret void33;34 %3 = alloca ptr, align 435 %4 = alloca i32, align 436 %5 = alloca %struct.S, align 437 %6 = bitcast ptr %0 to ptr38 store ptr %6, ptr %3, align 439 store i32 %1, ptr %4, align 440 %7 = bitcast ptr %0 to ptr41 call void @llvm.memcpy.p0.p0.i32(ptr align 4 %7, ptr align 4 @pattern, i32 8, i1 false), !annotation !042 %8 = load i32, ptr %4, align 443 %9 = icmp eq i32 %8, 4244 br i1 %9, label %10, label %1345 4610: ; preds = %247 call void @g(ptr sret(%struct.S) align 4 %5)48 %11 = bitcast ptr %0 to ptr49 %12 = bitcast ptr %5 to ptr50 call void @llvm.memcpy.p0.p0.i32(ptr align 4 %11, ptr align 4 %12, i32 8, i1 false)51 br label %1352 5313: ; preds = %10, %254 ret void55}56 57declare void @g(ptr sret(%struct.S) align 4, ...)58 59declare void @llvm.memcpy.p0.p0.i32(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i32, i1 immarg) #060 61!0 = !{!"auto-init"}62 63