1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -S -passes='move-auto-init' -verify-memoryssa | FileCheck %s 3 4target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" 5 6define void @foo(i32 %x) { 7; CHECK-LABEL: @foo( 8; CHECK-NEXT: entry: 9; CHECK-NEXT: [[BUFFER:%.*]] = alloca [80 x i32], align 16 10; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 16 [[BUFFER]], i8 -86, i64 320, i1 false), !annotation [[META0:![0-9]+]] 11; CHECK-NEXT: br label [[DO_BODY:%.*]] 12; CHECK: do.body: 13; CHECK-NEXT: [[X_ADDR_0:%.*]] = phi i32 [ [[X:%.*]], [[ENTRY:%.*]] ], [ [[DEC:%.*]], [[DO_COND:%.*]] ] 14; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [80 x i32], ptr [[BUFFER]], i64 0, i64 0 15; CHECK-NEXT: call void @dump(ptr [[ARRAYIDX]]) 16; CHECK-NEXT: br label [[DO_COND]] 17; CHECK: do.cond: 18; CHECK-NEXT: [[DEC]] = add nsw i32 [[X_ADDR_0]], -1 19; CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[X_ADDR_0]], 0 20; CHECK-NEXT: br i1 [[TOBOOL]], label [[DO_BODY]], label [[DO_END:%.*]] 21; CHECK: do.end: 22; CHECK-NEXT: ret void 23; 24 25entry: 26 %buffer = alloca [80 x i32], align 16 27 call void @llvm.memset.p0.i64(ptr align 16 %buffer, i8 -86, i64 320, i1 false), !annotation !0 28 br label %do.body 29 30do.body: ; preds = %do.cond, %entry 31 %x.addr.0 = phi i32 [ %x, %entry ], [ %dec, %do.cond ] 32 %arrayidx = getelementptr inbounds [80 x i32], ptr %buffer, i64 0, i64 0 33 call void @dump(ptr %arrayidx) 34 br label %do.cond 35 36do.cond: ; preds = %do.body 37 %dec = add nsw i32 %x.addr.0, -1 38 %tobool = icmp ne i32 %x.addr.0, 0 39 br i1 %tobool, label %do.body, label %do.end 40 41do.end: ; preds = %do.cond 42 ret void 43} 44 45declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) 46 47declare void @dump(ptr ) 48 49define void @bar(i32 %x, i32 %y) { 50; CHECK-LABEL: @bar( 51; CHECK-NEXT: entry: 52; CHECK-NEXT: [[BUFFER:%.*]] = alloca [80 x i32], align 16 53; CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[Y:%.*]], 0 54; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 55; CHECK: if.then: 56; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 16 [[BUFFER]], i8 -86, i64 320, i1 false), !annotation [[META0]] 57; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[X:%.*]], [[Y]] 58; CHECK-NEXT: br label [[DO_BODY:%.*]] 59; CHECK: do.body: 60; CHECK-NEXT: [[X_ADDR_0:%.*]] = phi i32 [ [[ADD]], [[IF_THEN]] ], [ [[DEC:%.*]], [[DO_COND:%.*]] ] 61; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [80 x i32], ptr [[BUFFER]], i64 0, i64 0 62; CHECK-NEXT: call void @dump(ptr [[ARRAYIDX]]) 63; CHECK-NEXT: br label [[DO_COND]] 64; CHECK: do.cond: 65; CHECK-NEXT: [[DEC]] = add nsw i32 [[X_ADDR_0]], -1 66; CHECK-NEXT: [[TOBOOL1:%.*]] = icmp ne i32 [[X_ADDR_0]], 0 67; CHECK-NEXT: br i1 [[TOBOOL1]], label [[DO_BODY]], label [[DO_END:%.*]] 68; CHECK: do.end: 69; CHECK-NEXT: br label [[IF_END]] 70; CHECK: if.end: 71; CHECK-NEXT: ret void 72; 73 74entry: 75 %buffer = alloca [80 x i32], align 16 76 call void @llvm.memset.p0.i64(ptr align 16 %buffer, i8 -86, i64 320, i1 false), !annotation !0 77 %tobool = icmp ne i32 %y, 0 78 br i1 %tobool, label %if.then, label %if.end 79 80if.then: ; preds = %entry 81 %add = add nsw i32 %x, %y 82 br label %do.body 83 84do.body: ; preds = %do.cond, %if.then 85 %x.addr.0 = phi i32 [ %add, %if.then ], [ %dec, %do.cond ] 86 %arrayidx = getelementptr inbounds [80 x i32], ptr %buffer, i64 0, i64 0 87 call void @dump(ptr %arrayidx) 88 br label %do.cond 89 90do.cond: ; preds = %do.body 91 %dec = add nsw i32 %x.addr.0, -1 92 %tobool1 = icmp ne i32 %x.addr.0, 0 93 br i1 %tobool1, label %do.body, label %do.end 94 95do.end: ; preds = %do.cond 96 br label %if.end 97 98if.end: ; preds = %do.end, %entry 99 ret void 100} 101 102declare void @dummy() 103 104define void @unreachable_pred() { 105; CHECK-LABEL: @unreachable_pred( 106; CHECK-NEXT: entry: 107; CHECK-NEXT: [[P:%.*]] = alloca [2 x i16], i32 0, align 2 108; CHECK-NEXT: store i32 0, ptr [[P]], align 2, !annotation [[META0]] 109; CHECK-NEXT: br i1 true, label [[LOOP:%.*]], label [[USEBB:%.*]] 110; CHECK: loop: 111; CHECK-NEXT: call void @dummy() 112; CHECK-NEXT: br label [[LOOP]] 113; CHECK: a: 114; CHECK-NEXT: br label [[LOOP]] 115; CHECK: b: 116; CHECK-NEXT: br label [[LOOP]] 117; CHECK: usebb: 118; CHECK-NEXT: [[USE_P:%.*]] = icmp ult ptr null, [[P]] 119; CHECK-NEXT: ret void 120; 121entry: 122 %p = alloca [2 x i16], i32 0, align 2 123 store i32 0, ptr %p, align 2, !annotation !0 124 br i1 true, label %loop, label %usebb 125 126loop: 127 call void @dummy() 128 br label %loop 129 130a: 131 br label %loop 132 133b: 134 br label %loop 135 136usebb: 137 %use_p = icmp ult ptr null, %p 138 ret void 139} 140 141!0 = !{!"auto-init"} 142