1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes=dse -S < %s | FileCheck %s 3 4@global = external constant i8 5 6define void @f() { 7; CHECK-LABEL: @f( 8; CHECK-NEXT: [[TMP1:%.*]] = call noalias ptr @_Znwm(i64 32) 9; CHECK-NEXT: [[TMP2:%.*]] = icmp ugt ptr [[TMP1]], @global 10; CHECK-NEXT: call void @llvm.assume(i1 [[TMP2]]) 11; CHECK-NEXT: store i8 0, ptr [[TMP1]], align 1 12; CHECK-NEXT: ret void 13; 14 %tmp1 = call noalias ptr @_Znwm(i64 32) 15 %tmp2 = icmp ugt ptr %tmp1, @global 16 call void @llvm.assume(i1 %tmp2) 17 store i8 0, ptr %tmp1, align 1 18 ret void 19} 20 21define void @f2() { 22; CHECK-LABEL: @f2( 23; CHECK-NEXT: [[TMP1:%.*]] = call noalias ptr @_Znwm(i64 32) 24; CHECK-NEXT: [[TMP2:%.*]] = icmp ugt ptr [[TMP1]], @global 25; CHECK-NEXT: call void @llvm.assume(i1 [[TMP2]]) 26; CHECK-NEXT: store i8 0, ptr [[TMP1]], align 1 27; CHECK-NEXT: call void @quux(ptr @global) 28; CHECK-NEXT: ret void 29; 30 %tmp1 = call noalias ptr @_Znwm(i64 32) 31 %tmp2 = icmp ugt ptr %tmp1, @global 32 call void @llvm.assume(i1 %tmp2) 33 store i8 0, ptr %tmp1, align 1 34 call void @quux(ptr @global) 35 ret void 36} 37 38; FIXME: This is a miscompile 39define void @pr70547() { 40; CHECK-LABEL: @pr70547( 41; CHECK-NEXT: [[A:%.*]] = alloca i8, align 1 42; CHECK-NEXT: store i8 0, ptr [[A]], align 1 43; CHECK-NEXT: [[CALL:%.*]] = call ptr @quux(ptr [[A]]) #[[ATTR1:[0-9]+]] 44; CHECK-NEXT: [[V:%.*]] = load i8, ptr [[CALL]], align 1 45; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[V]], 1 46; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]]) 47; CHECK-NEXT: ret void 48; 49 %a = alloca i8 50 store i8 0, ptr %a 51 %call = call ptr @quux(ptr %a) memory(none) nounwind willreturn 52 %v = load i8, ptr %call 53 %cmp = icmp ne i8 %v, 1 54 call void @llvm.assume(i1 %cmp) 55 ret void 56} 57 58declare ptr @_Znwm(i64) 59 60declare void @llvm.assume(i1) 61 62declare void @quux(ptr) 63