1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=dse -S | FileCheck %s 3 4target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" 5 6define void @second_store_smaller_1(ptr noalias %P, i1 %c) { 7; CHECK-LABEL: @second_store_smaller_1( 8; CHECK-NEXT: store i32 0, ptr [[P:%.*]], align 4 9; CHECK-NEXT: br i1 [[C:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] 10; CHECK: bb1: 11; CHECK-NEXT: br label [[BB3:%.*]] 12; CHECK: bb2: 13; CHECK-NEXT: br label [[BB3]] 14; CHECK: bb3: 15; CHECK-NEXT: ret void 16; 17 store i32 1, ptr %P 18 br i1 %c, label %bb1, label %bb2 19bb1: 20 br label %bb3 21bb2: 22 br label %bb3 23bb3: 24 store i16 0, ptr %P 25 ret void 26} 27 28define void @second_store_smaller_2(ptr noalias %P, i1 %c) { 29; CHECK-LABEL: @second_store_smaller_2( 30; CHECK-NEXT: store i32 12345, ptr [[P:%.*]], align 4 31; CHECK-NEXT: br i1 [[C:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] 32; CHECK: bb1: 33; CHECK-NEXT: br label [[BB3:%.*]] 34; CHECK: bb2: 35; CHECK-NEXT: br label [[BB3]] 36; CHECK: bb3: 37; CHECK-NEXT: ret void 38; 39 store i32 1, ptr %P 40 br i1 %c, label %bb1, label %bb2 41bb1: 42 br label %bb3 43bb2: 44 br label %bb3 45bb3: 46 store i16 12345, ptr %P 47 ret void 48} 49 50declare void @use(i16) readnone 51declare void @use.i8(i8) readnone 52 53define void @second_store_smaller_3(ptr noalias %P, i1 %c) { 54; CHECK-LABEL: @second_store_smaller_3( 55; CHECK-NEXT: store i32 1, ptr [[P:%.*]], align 4 56; CHECK-NEXT: br i1 [[C:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] 57; CHECK: bb1: 58; CHECK-NEXT: [[L1:%.*]] = load i16, ptr [[P]], align 2 59; CHECK-NEXT: call void @use(i16 [[L1]]) 60; CHECK-NEXT: br label [[BB3:%.*]] 61; CHECK: bb2: 62; CHECK-NEXT: br label [[BB3]] 63; CHECK: bb3: 64; CHECK-NEXT: store i16 -31073, ptr [[P]], align 2 65; CHECK-NEXT: ret void 66; 67 store i32 1, ptr %P 68 br i1 %c, label %bb1, label %bb2 69 70bb1: 71 %l1 = load i16, ptr %P 72 call void @use(i16 %l1) 73 br label %bb3 74bb2: 75 br label %bb3 76bb3: 77 store i16 -31073, ptr %P 78 ret void 79} 80 81define void @second_store_smaller_4(ptr noalias %P, i1 %c) { 82; CHECK-LABEL: @second_store_smaller_4( 83; CHECK-NEXT: store i32 1, ptr [[P:%.*]], align 4 84; CHECK-NEXT: br i1 [[C:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] 85; CHECK: bb1: 86; CHECK-NEXT: [[L1:%.*]] = load i8, ptr [[P]], align 1 87; CHECK-NEXT: call void @use.i8(i8 [[L1]]) 88; CHECK-NEXT: br label [[BB3:%.*]] 89; CHECK: bb2: 90; CHECK-NEXT: br label [[BB3]] 91; CHECK: bb3: 92; CHECK-NEXT: store i16 -31073, ptr [[P]], align 2 93; CHECK-NEXT: ret void 94; 95 store i32 1, ptr %P 96 br i1 %c, label %bb1, label %bb2 97 98bb1: 99 %l1 = load i8, ptr %P 100 call void @use.i8(i8 %l1) 101 br label %bb3 102bb2: 103 br label %bb3 104bb3: 105 store i16 -31073, ptr %P 106 ret void 107} 108 109define void @second_store_smaller_5(ptr noalias %P, i16 %x, i1 %c) { 110; CHECK-LABEL: @second_store_smaller_5( 111; CHECK-NEXT: store i32 1, ptr [[P:%.*]], align 4 112; CHECK-NEXT: br i1 [[C:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] 113; CHECK: bb1: 114; CHECK-NEXT: br label [[BB3:%.*]] 115; CHECK: bb2: 116; CHECK-NEXT: br label [[BB3]] 117; CHECK: bb3: 118; CHECK-NEXT: store i16 [[X:%.*]], ptr [[P]], align 2 119; CHECK-NEXT: ret void 120; 121 store i32 1, ptr %P 122 br i1 %c, label %bb1, label %bb2 123bb1: 124 br label %bb3 125bb2: 126 br label %bb3 127bb3: 128 store i16 %x, ptr %P 129 ret void 130} 131 132define void @second_store_bigger(ptr noalias %P, i1 %c) { 133; CHECK-LABEL: @second_store_bigger( 134; CHECK-NEXT: br i1 [[C:%.*]], label [[BB1:%.*]], label [[BB2:%.*]] 135; CHECK: bb1: 136; CHECK-NEXT: br label [[BB3:%.*]] 137; CHECK: bb2: 138; CHECK-NEXT: br label [[BB3]] 139; CHECK: bb3: 140; CHECK-NEXT: store i64 0, ptr [[P:%.*]], align 8 141; CHECK-NEXT: ret void 142; 143 store i32 1, ptr %P 144 br i1 %c, label %bb1, label %bb2 145bb1: 146 br label %bb3 147bb2: 148 br label %bb3 149bb3: 150 store i64 0, ptr %P 151 ret void 152} 153