1; RUN: opt -S -dse < %s | FileCheck %s 2target datalayout = "E-m:e-i64:64-n32:64" 3target triple = "powerpc64-bgq-linux" 4 5%"struct.std::complex" = type { { float, float } } 6 7define void @_Z4testSt7complexIfE(%"struct.std::complex"* noalias nocapture sret %agg.result, i64 %c.coerce) { 8entry: 9; CHECK-LABEL: @_Z4testSt7complexIfE 10 11 %ref.tmp = alloca i64, align 8 12 %tmpcast = bitcast i64* %ref.tmp to %"struct.std::complex"* 13 %c.sroa.0.0.extract.shift = lshr i64 %c.coerce, 32 14 %c.sroa.0.0.extract.trunc = trunc i64 %c.sroa.0.0.extract.shift to i32 15 %0 = bitcast i32 %c.sroa.0.0.extract.trunc to float 16 %c.sroa.2.0.extract.trunc = trunc i64 %c.coerce to i32 17 %1 = bitcast i32 %c.sroa.2.0.extract.trunc to float 18 call void @_Z3barSt7complexIfE(%"struct.std::complex"* nonnull sret %tmpcast, i64 %c.coerce) 19 %2 = bitcast %"struct.std::complex"* %agg.result to i64* 20 %3 = load i64, i64* %ref.tmp, align 8 21 store i64 %3, i64* %2, align 4 22; CHECK-NOT: store i64 23 24 %_M_value.realp.i.i = getelementptr inbounds %"struct.std::complex", %"struct.std::complex"* %agg.result, i64 0, i32 0, i32 0 25 %4 = lshr i64 %3, 32 26 %5 = trunc i64 %4 to i32 27 %6 = bitcast i32 %5 to float 28 %_M_value.imagp.i.i = getelementptr inbounds %"struct.std::complex", %"struct.std::complex"* %agg.result, i64 0, i32 0, i32 1 29 %7 = trunc i64 %3 to i32 30 %8 = bitcast i32 %7 to float 31 %mul_ad.i.i = fmul fast float %6, %1 32 %mul_bc.i.i = fmul fast float %8, %0 33 %mul_i.i.i = fadd fast float %mul_ad.i.i, %mul_bc.i.i 34 %mul_ac.i.i = fmul fast float %6, %0 35 %mul_bd.i.i = fmul fast float %8, %1 36 %mul_r.i.i = fsub fast float %mul_ac.i.i, %mul_bd.i.i 37 store float %mul_r.i.i, float* %_M_value.realp.i.i, align 4 38 store float %mul_i.i.i, float* %_M_value.imagp.i.i, align 4 39 ret void 40; CHECK: ret void 41} 42 43declare void @_Z3barSt7complexIfE(%"struct.std::complex"* sret, i64) 44 45define void @test1(i32 *%ptr) { 46entry: 47; CHECK-LABEL: @test1 48 49 store i32 5, i32* %ptr 50 %bptr = bitcast i32* %ptr to i8* 51 store i8 7, i8* %bptr 52 %wptr = bitcast i32* %ptr to i16* 53 store i16 -30062, i16* %wptr 54 %bptr2 = getelementptr inbounds i8, i8* %bptr, i64 2 55 store i8 25, i8* %bptr2 56 %bptr3 = getelementptr inbounds i8, i8* %bptr, i64 3 57 store i8 47, i8* %bptr3 58 %bptr1 = getelementptr inbounds i8, i8* %bptr, i64 1 59 %wptrp = bitcast i8* %bptr1 to i16* 60 store i16 2020, i16* %wptrp, align 1 61 ret void 62 63; CHECK-NOT: store i32 5, i32* %ptr 64; CHECK-NOT: store i8 7, i8* %bptr 65; CHECK: store i16 -30062, i16* %wptr 66; CHECK-NOT: store i8 25, i8* %bptr2 67; CHECK: store i8 47, i8* %bptr3 68; CHECK: store i16 2020, i16* %wptrp, align 1 69 70; CHECK: ret void 71} 72 73define void @test2(i32 *%ptr) { 74entry: 75; CHECK-LABEL: @test2 76 77 store i32 5, i32* %ptr 78 79 %bptr = bitcast i32* %ptr to i8* 80 %bptrm1 = getelementptr inbounds i8, i8* %bptr, i64 -1 81 %bptr1 = getelementptr inbounds i8, i8* %bptr, i64 1 82 %bptr2 = getelementptr inbounds i8, i8* %bptr, i64 2 83 %bptr3 = getelementptr inbounds i8, i8* %bptr, i64 3 84 85 %wptr = bitcast i8* %bptr to i16* 86 %wptrm1 = bitcast i8* %bptrm1 to i16* 87 %wptr1 = bitcast i8* %bptr1 to i16* 88 %wptr2 = bitcast i8* %bptr2 to i16* 89 %wptr3 = bitcast i8* %bptr3 to i16* 90 91 store i16 1456, i16* %wptrm1, align 1 92 store i16 1346, i16* %wptr, align 1 93 store i16 1756, i16* %wptr1, align 1 94 store i16 1126, i16* %wptr2, align 1 95 store i16 5656, i16* %wptr3, align 1 96 97; CHECK-NOT: store i32 5, i32* %ptr 98 99; CHECK: store i16 1456, i16* %wptrm1, align 1 100; CHECK: store i16 1346, i16* %wptr, align 1 101; CHECK: store i16 1756, i16* %wptr1, align 1 102; CHECK: store i16 1126, i16* %wptr2, align 1 103; CHECK: store i16 5656, i16* %wptr3, align 1 104 105 ret void 106 107; CHECK: ret void 108} 109 110define signext i8 @test3(i32 *%ptr) { 111entry: 112; CHECK-LABEL: @test3 113 114 store i32 5, i32* %ptr 115 116 %bptr = bitcast i32* %ptr to i8* 117 %bptrm1 = getelementptr inbounds i8, i8* %bptr, i64 -1 118 %bptr1 = getelementptr inbounds i8, i8* %bptr, i64 1 119 %bptr2 = getelementptr inbounds i8, i8* %bptr, i64 2 120 %bptr3 = getelementptr inbounds i8, i8* %bptr, i64 3 121 122 %wptr = bitcast i8* %bptr to i16* 123 %wptrm1 = bitcast i8* %bptrm1 to i16* 124 %wptr1 = bitcast i8* %bptr1 to i16* 125 %wptr2 = bitcast i8* %bptr2 to i16* 126 %wptr3 = bitcast i8* %bptr3 to i16* 127 128 %v = load i8, i8* %bptr, align 1 129 store i16 1456, i16* %wptrm1, align 1 130 store i16 1346, i16* %wptr, align 1 131 store i16 1756, i16* %wptr1, align 1 132 store i16 1126, i16* %wptr2, align 1 133 store i16 5656, i16* %wptr3, align 1 134 135; CHECK: store i32 5, i32* %ptr 136 137 ret i8 %v 138 139; CHECK: ret i8 %v 140} 141 142%struct.foostruct = type { 143i32 (i8*, i8**, i32, i8, i8*)*, 144i32 (i8*, i8**, i32, i8, i8*)*, 145i32 (i8*, i8**, i32, i8, i8*)*, 146i32 (i8*, i8**, i32, i8, i8*)*, 147void (i8*, i32, i32)* 148} 149declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) 150declare void @goFunc(%struct.foostruct*) 151declare i32 @fa(i8*, i8**, i32, i8, i8*) 152 153define void @test4() { 154entry: 155; CHECK-LABEL: @test4 156 157 %bang = alloca %struct.foostruct, align 8 158 %v1 = bitcast %struct.foostruct* %bang to i8* 159 call void @llvm.memset.p0i8.i64(i8* %v1, i8 0, i64 40, i32 8, i1 false) 160 %v2 = getelementptr inbounds %struct.foostruct, %struct.foostruct* %bang, i64 0, i32 0 161 store i32 (i8*, i8**, i32, i8, i8*)* @fa, i32 (i8*, i8**, i32, i8, i8*)** %v2, align 8 162 %v3 = getelementptr inbounds %struct.foostruct, %struct.foostruct* %bang, i64 0, i32 1 163 store i32 (i8*, i8**, i32, i8, i8*)* @fa, i32 (i8*, i8**, i32, i8, i8*)** %v3, align 8 164 %v4 = getelementptr inbounds %struct.foostruct, %struct.foostruct* %bang, i64 0, i32 2 165 store i32 (i8*, i8**, i32, i8, i8*)* @fa, i32 (i8*, i8**, i32, i8, i8*)** %v4, align 8 166 %v5 = getelementptr inbounds %struct.foostruct, %struct.foostruct* %bang, i64 0, i32 3 167 store i32 (i8*, i8**, i32, i8, i8*)* @fa, i32 (i8*, i8**, i32, i8, i8*)** %v5, align 8 168 %v6 = getelementptr inbounds %struct.foostruct, %struct.foostruct* %bang, i64 0, i32 4 169 store void (i8*, i32, i32)* null, void (i8*, i32, i32)** %v6, align 8 170 call void @goFunc(%struct.foostruct* %bang) 171 ret void 172 173; CHECK-NOT: memset 174; CHECK: ret void 175} 176 177define signext i8 @test5(i32 *%ptr) { 178entry: 179; CHECK-LABEL: @test5 180 181 store i32 0, i32* %ptr 182 183 %bptr = bitcast i32* %ptr to i8* 184 %bptr1 = getelementptr inbounds i8, i8* %bptr, i64 1 185 %bptr2 = getelementptr inbounds i8, i8* %bptr, i64 2 186 %bptr3 = getelementptr inbounds i8, i8* %bptr, i64 3 187 188 %wptr = bitcast i8* %bptr to i16* 189 %wptr1 = bitcast i8* %bptr1 to i16* 190 %wptr2 = bitcast i8* %bptr2 to i16* 191 192 store i16 65535, i16* %wptr2, align 1 193 store i16 1456, i16* %wptr1, align 1 194 store i16 1346, i16* %wptr, align 1 195 196; CHECK-NOT: store i32 0, i32* %ptr 197 198 ret i8 0 199} 200 201define signext i8 @test6(i32 *%ptr) { 202entry: 203; CHECK-LABEL: @test6 204 205 store i32 0, i32* %ptr 206 207 %bptr = bitcast i32* %ptr to i16* 208 %bptr1 = getelementptr inbounds i16, i16* %bptr, i64 0 209 %bptr2 = getelementptr inbounds i16, i16* %bptr, i64 1 210 211 store i16 1456, i16* %bptr2, align 1 212 store i16 65535, i16* %bptr1, align 1 213 214; CHECK-NOT: store i32 0, i32* %ptr 215 216 ret i8 0 217} 218 219define signext i8 @test7(i64 *%ptr) { 220entry: 221; CHECK-LABEL: @test7 222 223 store i64 0, i64* %ptr 224 225 %bptr = bitcast i64* %ptr to i16* 226 %bptr1 = getelementptr inbounds i16, i16* %bptr, i64 0 227 %bptr2 = getelementptr inbounds i16, i16* %bptr, i64 1 228 %bptr3 = getelementptr inbounds i16, i16* %bptr, i64 2 229 %bptr4 = getelementptr inbounds i16, i16* %bptr, i64 3 230 231 store i16 1346, i16* %bptr1, align 1 232 store i16 1756, i16* %bptr3, align 1 233 store i16 1456, i16* %bptr2, align 1 234 store i16 5656, i16* %bptr4, align 1 235 236; CHECK-NOT: store i64 0, i64* %ptr 237 238 ret i8 0 239} 240