1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -basic-aa -memcpyopt -S < %s -verify-memoryssa | FileCheck %s 3 4target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" 5target triple = "x86_64-apple-macosx10.7.0" 6 7@x = global i32 0 8 9declare void @otherf(i32*) 10 11declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i1) nounwind 12 13; memcpyopt should not touch atomic ops 14define void @test1() nounwind uwtable ssp { 15; CHECK-LABEL: @test1( 16; CHECK-NEXT: [[X:%.*]] = alloca [101 x i32], align 16 17; CHECK-NEXT: [[BC:%.*]] = bitcast [101 x i32]* [[X]] to i8* 18; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* align 16 [[BC]], i8 0, i64 400, i1 false) 19; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds [101 x i32], [101 x i32]* [[X]], i32 0, i32 100 20; CHECK-NEXT: store atomic i32 0, i32* [[GEP1]] unordered, align 4 21; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds [101 x i32], [101 x i32]* [[X]], i32 0, i32 0 22; CHECK-NEXT: call void @otherf(i32* [[GEP2]]) 23; CHECK-NEXT: ret void 24; 25 %x = alloca [101 x i32], align 16 26 %bc = bitcast [101 x i32]* %x to i8* 27 call void @llvm.memset.p0i8.i64(i8* align 16 %bc, i8 0, i64 400, i1 false) 28 %gep1 = getelementptr inbounds [101 x i32], [101 x i32]* %x, i32 0, i32 100 29 store atomic i32 0, i32* %gep1 unordered, align 4 30 %gep2 = getelementptr inbounds [101 x i32], [101 x i32]* %x, i32 0, i32 0 31 call void @otherf(i32* %gep2) 32 ret void 33} 34 35; memcpyopt across unordered store 36define void @test2() nounwind uwtable ssp { 37; CHECK-LABEL: @test2( 38; CHECK-NEXT: [[OLD:%.*]] = alloca i32, align 4 39; CHECK-NEXT: [[NEW:%.*]] = alloca i32, align 4 40; CHECK-NEXT: call void @otherf(i32* nocapture [[NEW]]) 41; CHECK-NEXT: store atomic i32 0, i32* @x unordered, align 4 42; CHECK-NEXT: call void @otherf(i32* nocapture [[NEW]]) 43; CHECK-NEXT: ret void 44; 45 %old = alloca i32 46 %new = alloca i32 47 call void @otherf(i32* nocapture %old) 48 store atomic i32 0, i32* @x unordered, align 4 49 %v = load i32, i32* %old 50 store i32 %v, i32* %new 51 call void @otherf(i32* nocapture %new) 52 ret void 53} 54 55