; RUN: opt < %s -basicaa -dse -S | FileCheck %s declare noalias i8* @calloc(i64, i64) define i32* @test1() { ; CHECK-LABEL: test1 %1 = tail call noalias i8* @calloc(i64 1, i64 4) %2 = bitcast i8* %1 to i32* ; This store is dead and should be removed store i32 0, i32* %2, align 4 ; CHECK-NOT: store i32 0, i32* %2, align 4 ret i32* %2 } define i32* @test2() { ; CHECK-LABEL: test2 %1 = tail call noalias i8* @calloc(i64 1, i64 4) %2 = bitcast i8* %1 to i32* %3 = getelementptr i32, i32* %2, i32 5 store i32 0, i32* %3, align 4 ; CHECK-NOT: store i32 0, i32* %2, align 4 ret i32* %2 } define i32* @test3(i32 *%arg) { ; CHECK-LABEL: test3 store i32 0, i32* %arg, align 4 ; CHECK: store i32 0, i32* %arg, align 4 ret i32* %arg } declare void @clobber_memory(i8*) define i8* @test4() { ; CHECK-LABEL: test4 %1 = tail call noalias i8* @calloc(i64 1, i64 4) call void @clobber_memory(i8* %1) store i8 0, i8* %1, align 4 ; CHECK: store i8 0, i8* %1, align 4 ret i8* %1 } define i32* @test5() { ; CHECK-LABEL: test5 %1 = tail call noalias i8* @calloc(i64 1, i64 4) %2 = bitcast i8* %1 to i32* store volatile i32 0, i32* %2, align 4 ; CHECK: store volatile i32 0, i32* %2, align 4 ret i32* %2 } define i8* @test6() { ; CHECK-LABEL: test6 %1 = tail call noalias i8* @calloc(i64 1, i64 4) store i8 5, i8* %1, align 4 ; CHECK: store i8 5, i8* %1, align 4 ret i8* %1 } define i8* @test7(i8 %arg) { ; CHECK-LABEL: test7 %1 = tail call noalias i8* @calloc(i64 1, i64 4) store i8 %arg, i8* %1, align 4 ; CHECK: store i8 %arg, i8* %1, align 4 ret i8* %1 }