[Test] rewrite inline_nossp.ll
authorNick Desaulniers <ndesaulniers@google.com>
Mon, 28 Jun 2021 20:52:41 +0000 (13:52 -0700)
committerNick Desaulniers <ndesaulniers@google.com>
Mon, 28 Jun 2021 20:52:45 +0000 (13:52 -0700)
While adding remark based tests in D104944, I noticed that the tests
that we were passing were passing for the wrong reason. They were
passing because the dynamic allocas were preventing inlining, not the
code I added in D91816.

Rewrite and simplify the test. Add remark based checks to validate we're
preventing inline substitutions for the right reasons.

Reviewed By: MaskRay

Differential Revision: https://reviews.llvm.org/D104958

llvm/test/Transforms/Inline/inline_nossp.ll

index dde75cc..586735e 100644 (file)
@@ -1,97 +1,37 @@
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
-; RUN: opt -inline -o - -S %s | FileCheck %s
-; RUN: opt -passes='cgscc(inline)' %s -S | FileCheck %s
+; RUN: opt -inline -o - -S %s -pass-remarks-missed=inline 2>&1 | FileCheck --check-prefixes=CHECK,CHECK-INLINE %s
+; RUN: opt -passes='cgscc(inline)' %s -S -pass-remarks-missed=inline 2>&1 | FileCheck --check-prefixes=CHECK,CHECK-INLINE %s
 ; RUN: opt -always-inline -o - -S %s | FileCheck %s
 ; RUN: opt -passes=always-inline -o - -S %s | FileCheck %s
 
-declare dso_local void @foo(i8*)
+; CHECK-INLINE: ssp not inlined into nossp_caller because it should never be inlined (cost=never): stack protected callee but caller requested no stack protector
+; CHECK-INLINE: nossp not inlined into ssp_caller because it should never be inlined (cost=never): stack protected caller but callee requested no stack protector
 
 ; Not interesting to test.
-define dso_local void @ssp(i64 %0) #0 {
-  %2 = alloca i64, align 8
-  store i64 %0, i64* %2, align 8
-  %3 = load i64, i64* %2, align 8
-  %4 = alloca i8, i64 %3, align 16
-  call void @foo(i8* %4)
-  ret void
-}
-
-; Not interesting to test.
-define dso_local void @ssp_alwaysinline(i64 %0) #1 {
-  %2 = alloca i64, align 8
-  store i64 %0, i64* %2, align 8
-  %3 = load i64, i64* %2, align 8
-  %4 = alloca i8, i64 %3, align 16
-  call void @foo(i8* %4)
-  ret void
-}
+define i32 @nossp() { ret i32 41 }
+define i32 @ssp() sspstrong { ret i32 42 }
+define i32 @nossp_alwaysinline() alwaysinline { ret i32 43 }
+define i32 @ssp_alwaysinline() sspstrong alwaysinline { ret i32 44 }
 
 ; @ssp should not be inlined due to mismatch stack protector.
 ; @ssp_alwaysinline should be inlined due to alwaysinline.
-define dso_local void @nossp() {
-; CHECK-LABEL: @nossp(
-; CHECK-NEXT:    [[TMP1:%.*]] = alloca i64, align 8
-; CHECK-NEXT:    call void @ssp(i64 1024)
-; CHECK-NEXT:    [[SAVEDSTACK:%.*]] = call i8* @llvm.stacksave()
-; CHECK-NEXT:    [[TMP2:%.*]] = bitcast i64* [[TMP1]] to i8*
-; CHECK-NEXT:    call void @llvm.lifetime.start.p0i8(i64 8, i8* [[TMP2]])
-; CHECK-NEXT:    store i64 1024, i64* [[TMP1]], align 8
-; CHECK-NEXT:    [[TMP3:%.*]] = load i64, i64* [[TMP1]], align 8
-; CHECK-NEXT:    [[TMP4:%.*]] = alloca i8, i64 [[TMP3]], align 16
-; CHECK-NEXT:    call void @foo(i8* [[TMP4]])
-; CHECK-NEXT:    [[TMP5:%.*]] = bitcast i64* [[TMP1]] to i8*
-; CHECK-NEXT:    call void @llvm.lifetime.end.p0i8(i64 8, i8* [[TMP5]])
-; CHECK-NEXT:    call void @llvm.stackrestore(i8* [[SAVEDSTACK]])
-; CHECK-NEXT:    ret void
-;
-  call void @ssp(i64 1024)
-  call void @ssp_alwaysinline(i64 1024)
-  ret void
-}
-
-; This is the same case as @nossp above. That the caller has alwaysinline is
-; irrelevant.  Not interesting to test.
-define dso_local void @nossp_alwaysinline() #2 {
-  call void @ssp(i64 1024)
-  call void @ssp_alwaysinline(i64 1024)
-  ret void
-}
-
-; @nossp_alwaysinline should be inlined due to alwaysinline.
-; @ssp should not be inlined due to mismatch stack protector.
-; @ssp_alwaysinline should be inlined due to alwaysinline.
-define dso_local void @nossp_caller() {
+define i32 @nossp_caller() {
 ; CHECK-LABEL: @nossp_caller(
-; CHECK-NEXT:    [[TMP1:%.*]] = alloca i64, align 8
-; CHECK-NEXT:    [[SAVEDSTACK:%.*]] = call i8* @llvm.stacksave()
-; CHECK-NEXT:    call void @ssp(i64 1024)
-; CHECK-NEXT:    [[SAVEDSTACK_I:%.*]] = call i8* @llvm.stacksave()
-; CHECK-NEXT:    [[TMP2:%.*]] = bitcast i64* [[TMP1]] to i8*
-; CHECK-NEXT:    call void @llvm.lifetime.start.p0i8(i64 8, i8* [[TMP2]])
-; CHECK-NEXT:    store i64 1024, i64* [[TMP1]], align 8
-; CHECK-NEXT:    [[TMP3:%.*]] = load i64, i64* [[TMP1]], align 8
-; CHECK-NEXT:    [[TMP4:%.*]] = alloca i8, i64 [[TMP3]], align 16
-; CHECK-NEXT:    call void @foo(i8* [[TMP4]])
-; CHECK-NEXT:    [[TMP5:%.*]] = bitcast i64* [[TMP1]] to i8*
-; CHECK-NEXT:    call void @llvm.lifetime.end.p0i8(i64 8, i8* [[TMP5]])
-; CHECK-NEXT:    call void @llvm.stackrestore(i8* [[SAVEDSTACK_I]])
-; CHECK-NEXT:    call void @llvm.stackrestore(i8* [[SAVEDSTACK]])
-; CHECK-NEXT:    ret void
+; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @ssp()
+; CHECK-NEXT:    ret i32 44
 ;
-  call void @nossp_alwaysinline()
-  ret void
+  call i32 @ssp()
+  %2 = call i32 @ssp_alwaysinline()
+  ret i32 %2
 }
-
 ; @nossp should not be inlined due to mismatch stack protector.
-define dso_local void @ssp2() #0 {
-; CHECK-LABEL: @ssp2(
-; CHECK-NEXT:    call void @nossp()
-; CHECK-NEXT:    ret void
+; @nossp_alwaysinline should be inlined due to alwaysinline.
+define i32 @ssp_caller() sspstrong {
+; CHECK-LABEL: @ssp_caller(
+; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @nossp()
+; CHECK-NEXT:    ret i32 43
 ;
-  call void @nossp()
-  ret void
+  call i32 @nossp()
+  %2 = call i32 @nossp_alwaysinline()
+  ret i32 %2
 }
-
-attributes #0 = { sspstrong }
-attributes #1 = { sspstrong alwaysinline }
-attributes #2 = { alwaysinline}