| ; RUN: opt -S -Oz %s | FileCheck %s |
| |
| @a = global i32 4 |
| |
| define i32 @inner() { |
| %a1 = load volatile i32, i32* @a |
| |
| ; Here are enough instructions to prevent inlining, but because they are used |
| ; only by the @llvm.assume intrinsic, they're free (and, thus, inlining will |
| ; still happen). |
| %a2 = mul i32 %a1, %a1 |
| %a3 = sub i32 %a1, 5 |
| %a4 = udiv i32 %a3, -13 |
| %a5 = mul i32 %a4, %a4 |
| %a6 = add i32 %a5, %a5 |
| %ca = icmp sgt i32 %a6, -7 |
| tail call void @llvm.assume(i1 %ca) |
| |
| ret i32 %a1 |
| } |
| |
| ; @inner() should be inlined for -Oz. |
| ; CHECK-NOT: call i1 @inner |
| define i32 @outer() optsize { |
| %r = call i32 @inner() |
| ret i32 %r |
| } |
| |
| declare void @llvm.assume(i1) nounwind |
| |