1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -basic-aa -memcpyopt -S -enable-memcpyopt-memoryssa=0 | FileCheck %s 3; RUN: opt < %s -basic-aa -memcpyopt -S -enable-memcpyopt-memoryssa=1 -verify-memoryssa | FileCheck %s 4; PR10067 5; Make sure the call+copy isn't optimized in such a way that 6; %ret ends up with the wrong value. 7 8target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32" 9target triple = "i386-apple-darwin10" 10 11%struct1 = type { i32, i32 } 12%struct2 = type { %struct1, i8* } 13 14declare void @bar(%struct1* nocapture sret(%struct1) %agg.result) nounwind 15 16define i32 @foo() nounwind { 17; CHECK-LABEL: @foo( 18; CHECK-NEXT: [[X:%.*]] = alloca [[STRUCT1:%.*]], align 8 19; CHECK-NEXT: [[Y:%.*]] = alloca [[STRUCT2:%.*]], align 8 20; CHECK-NEXT: call void @bar(%struct1* sret(%struct1) [[X]]) [[ATTR0:#.*]] 21; CHECK-NEXT: [[GEPN1:%.*]] = getelementptr inbounds [[STRUCT2]], %struct2* [[Y]], i32 0, i32 0, i32 0 22; CHECK-NEXT: store i32 0, i32* [[GEPN1]], align 8 23; CHECK-NEXT: [[GEPN2:%.*]] = getelementptr inbounds [[STRUCT2]], %struct2* [[Y]], i32 0, i32 0, i32 1 24; CHECK-NEXT: store i32 0, i32* [[GEPN2]], align 4 25; CHECK-NEXT: [[BIT1:%.*]] = bitcast %struct1* [[X]] to i64* 26; CHECK-NEXT: [[BIT2:%.*]] = bitcast %struct2* [[Y]] to i64* 27; CHECK-NEXT: [[LOAD:%.*]] = load i64, i64* [[BIT1]], align 8 28; CHECK-NEXT: store i64 [[LOAD]], i64* [[BIT2]], align 8 29; CHECK-NEXT: [[GEP1:%.*]] = getelementptr [[STRUCT2]], %struct2* [[Y]], i32 0, i32 0, i32 0 30; CHECK-NEXT: [[RET:%.*]] = load i32, i32* [[GEP1]], align 4 31; CHECK-NEXT: ret i32 [[RET]] 32; 33 %x = alloca %struct1, align 8 34 %y = alloca %struct2, align 8 35 call void @bar(%struct1* sret(%struct1) %x) nounwind 36 37 %gepn1 = getelementptr inbounds %struct2, %struct2* %y, i32 0, i32 0, i32 0 38 store i32 0, i32* %gepn1, align 8 39 %gepn2 = getelementptr inbounds %struct2, %struct2* %y, i32 0, i32 0, i32 1 40 store i32 0, i32* %gepn2, align 4 41 42 %bit1 = bitcast %struct1* %x to i64* 43 %bit2 = bitcast %struct2* %y to i64* 44 %load = load i64, i64* %bit1, align 8 45 store i64 %load, i64* %bit2, align 8 46 47 48 %gep1 = getelementptr %struct2, %struct2* %y, i32 0, i32 0, i32 0 49 %ret = load i32, i32* %gep1 50 ret i32 %ret 51} 52