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