| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
| ; RUN: opt -passes=dse -S < %s | FileCheck %s |
| |
| @global = external constant i8 |
| |
| define void @f() { |
| ; CHECK-LABEL: @f( |
| ; CHECK-NEXT: [[TMP1:%.*]] = call noalias ptr @_Znwm(i64 32) |
| ; CHECK-NEXT: [[TMP2:%.*]] = icmp ugt ptr [[TMP1]], @global |
| ; CHECK-NEXT: call void @llvm.assume(i1 [[TMP2]]) |
| ; CHECK-NEXT: store i8 0, ptr [[TMP1]], align 1 |
| ; CHECK-NEXT: ret void |
| ; |
| %tmp1 = call noalias ptr @_Znwm(i64 32) |
| %tmp2 = icmp ugt ptr %tmp1, @global |
| call void @llvm.assume(i1 %tmp2) |
| store i8 0, ptr %tmp1, align 1 |
| ret void |
| } |
| |
| define void @f2() { |
| ; CHECK-LABEL: @f2( |
| ; CHECK-NEXT: [[TMP1:%.*]] = call noalias ptr @_Znwm(i64 32) |
| ; CHECK-NEXT: [[TMP2:%.*]] = icmp ugt ptr [[TMP1]], @global |
| ; CHECK-NEXT: call void @llvm.assume(i1 [[TMP2]]) |
| ; CHECK-NEXT: store i8 0, ptr [[TMP1]], align 1 |
| ; CHECK-NEXT: call void @quux(ptr @global) |
| ; CHECK-NEXT: ret void |
| ; |
| %tmp1 = call noalias ptr @_Znwm(i64 32) |
| %tmp2 = icmp ugt ptr %tmp1, @global |
| call void @llvm.assume(i1 %tmp2) |
| store i8 0, ptr %tmp1, align 1 |
| call void @quux(ptr @global) |
| ret void |
| } |
| |
| ; FIXME: This is a miscompile |
| define void @pr70547() { |
| ; CHECK-LABEL: @pr70547( |
| ; CHECK-NEXT: [[A:%.*]] = alloca i8, align 1 |
| ; CHECK-NEXT: store i8 0, ptr [[A]], align 1 |
| ; CHECK-NEXT: [[CALL:%.*]] = call ptr @quux(ptr [[A]]) #[[ATTR1:[0-9]+]] |
| ; CHECK-NEXT: [[V:%.*]] = load i8, ptr [[CALL]], align 1 |
| ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[V]], 1 |
| ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]]) |
| ; CHECK-NEXT: ret void |
| ; |
| %a = alloca i8 |
| store i8 0, ptr %a |
| %call = call ptr @quux(ptr %a) memory(none) nounwind willreturn |
| %v = load i8, ptr %call |
| %cmp = icmp ne i8 %v, 1 |
| call void @llvm.assume(i1 %cmp) |
| ret void |
| } |
| |
| declare ptr @_Znwm(i64) |
| |
| declare void @llvm.assume(i1) |
| |
| declare void @quux(ptr) |