| ; RUN: opt -S -codegenprepare -mtriple=x86_64-linux < %s | FileCheck %s |
| ; |
| ; Ensure that blocks that only contain @llvm.assume are removed completely |
| ; during CodeGenPrepare. |
| |
| ; CHECK-LABEL: @simple( |
| ; CHECK-NEXT: end: |
| ; CHECK-NEXT: ret void |
| define void @simple(i64 %addr, i1 %assumption) { |
| %cmp1 = icmp eq i64 %addr, 0 |
| br i1 %cmp1, label %do_assume, label %end |
| |
| do_assume: |
| tail call void @llvm.assume(i1 %assumption) |
| br label %end |
| |
| end: |
| ret void |
| } |
| |
| ; CHECK-LABEL: @complex_assume( |
| ; CHECK-NEXT: end: |
| ; CHECK-NEXT: ret void |
| define void @complex_assume(i64 %addr, i1 %assumption_a, i1 %assumption_b, |
| i64 %val_a, i64 %val_b) { |
| %cmp1 = icmp eq i64 %addr, 0 |
| br i1 %cmp1, label %do_assume, label %end |
| |
| do_assume: |
| call void @llvm.assume(i1 %assumption_a) |
| call void @llvm.assume(i1 %assumption_b) |
| %val_xor = xor i64 %val_a, %val_b |
| %val_shifted = lshr i64 %val_xor, 7 |
| %assumption_c = trunc i64 %val_shifted to i1 |
| call void @llvm.assume(i1 %assumption_c) |
| %assumption_d = call i1 @readonly_func(i64 %val_b) |
| call void @llvm.assume(i1 %assumption_d) |
| br label %end |
| |
| end: |
| ret void |
| } |
| |
| declare void @llvm.assume(i1 noundef) |
| declare i1 @readonly_func(i64) nounwind readonly willreturn; |
| |