[Inliner] Add extra test for callsite noalias metadata (NFC)
authorNikita Popov <nikita.ppv@gmail.com>
Sat, 31 Oct 2020 09:24:22 +0000 (10:24 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Sat, 31 Oct 2020 09:54:45 +0000 (10:54 +0100)
Test the case where the callee does not use noalias metadata itself.
This case is currently handled inconsistently.

llvm/test/Transforms/Inline/noalias-cs.ll

index 8528a39..20fffac 100644 (file)
@@ -1,9 +1,10 @@
-; RUN: opt -inline -enable-noalias-to-md-conversion -S < %s | FileCheck %s
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -inline -S < %s | FileCheck %s
 target datalayout = "e-i64:64-f80:128-n8:16:32:64-S128"
 target triple = "x86_64-unknown-linux-gnu"
 
-; Function Attrs: nounwind uwtable
-define void @foo2(float* nocapture %a, float* nocapture %b, float* nocapture readonly %c) #0 {
+; This callee uses scoped alias metadata internally itself.
+define void @callee_with_metadata(float* nocapture %a, float* nocapture %b, float* nocapture readonly %c) #0 {
 entry:
   %0 = load float, float* %c, align 4, !noalias !3
   %arrayidx.i = getelementptr inbounds float, float* %a, i64 5
@@ -16,33 +17,64 @@ entry:
   ret void
 }
 
-define void @foo(float* nocapture %a, float* nocapture %b, float* nocapture readonly %c) #0 {
+; This callee does not make use of scoped alias metadata itself.
+define void @callee_without_metadata(float* nocapture %a, float* nocapture %b, float* nocapture readonly %c) #0 {
 entry:
-  call void @foo2(float* %a, float* %b, float* %c), !noalias !0
-  call void @foo2(float* %b, float* %b, float* %a), !alias.scope !0
+  %0 = load float, float* %c, align 4
+  %arrayidx.i = getelementptr inbounds float, float* %a, i64 5
+  store float %0, float* %arrayidx.i, align 4
+  %arrayidx1.i = getelementptr inbounds float, float* %b, i64 8
+  store float %0, float* %arrayidx1.i, align 4
+  %1 = load float, float* %c, align 4
+  %arrayidx = getelementptr inbounds float, float* %a, i64 7
+  store float %1, float* %arrayidx, align 4
   ret void
 }
 
-; CHECK: define void @foo(float* nocapture %a, float* nocapture %b, float* nocapture readonly %c) #0 {
-; CHECK: entry:
-; CHECK:   %0 = load float, float* %c, align 4, !noalias !6
-; CHECK:   %arrayidx.i.i = getelementptr inbounds float, float* %a, i64 5
-; CHECK:   store float %0, float* %arrayidx.i.i, align 4, !alias.scope !12, !noalias !13
-; CHECK:   %arrayidx1.i.i = getelementptr inbounds float, float* %b, i64 8
-; CHECK:   store float %0, float* %arrayidx1.i.i, align 4, !alias.scope !14, !noalias !15
-; CHECK:   %1 = load float, float* %c, align 4, !noalias !16
-; CHECK:   %arrayidx.i = getelementptr inbounds float, float* %a, i64 7
-; CHECK:   store float %1, float* %arrayidx.i, align 4, !noalias !16
-; CHECK:   %2 = load float, float* %a, align 4, !alias.scope !16, !noalias !17
-; CHECK:   %arrayidx.i.i1 = getelementptr inbounds float, float* %b, i64 5
-; CHECK:   store float %2, float* %arrayidx.i.i1, align 4, !alias.scope !21, !noalias !22
-; CHECK:   %arrayidx1.i.i2 = getelementptr inbounds float, float* %b, i64 8
-; CHECK:   store float %2, float* %arrayidx1.i.i2, align 4, !alias.scope !23, !noalias !24
-; CHECK:   %3 = load float, float* %a, align 4, !alias.scope !16
-; CHECK:   %arrayidx.i3 = getelementptr inbounds float, float* %b, i64 7
-; CHECK:   store float %3, float* %arrayidx.i3, align 4, !alias.scope !16
-; CHECK:   ret void
-; CHECK: }
+define void @caller(float* nocapture %a, float* nocapture %b, float* nocapture readonly %c) #0 {
+; CHECK-LABEL: @caller(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[TMP0:%.*]] = load float, float* [[C:%.*]], align 4, !noalias !6
+; CHECK-NEXT:    [[ARRAYIDX_I_I:%.*]] = getelementptr inbounds float, float* [[A:%.*]], i64 5
+; CHECK-NEXT:    store float [[TMP0]], float* [[ARRAYIDX_I_I]], align 4, !alias.scope !12, !noalias !13
+; CHECK-NEXT:    [[ARRAYIDX1_I_I:%.*]] = getelementptr inbounds float, float* [[B:%.*]], i64 8
+; CHECK-NEXT:    store float [[TMP0]], float* [[ARRAYIDX1_I_I]], align 4, !alias.scope !14, !noalias !15
+; CHECK-NEXT:    [[TMP1:%.*]] = load float, float* [[C]], align 4, !noalias !16
+; CHECK-NEXT:    [[ARRAYIDX_I:%.*]] = getelementptr inbounds float, float* [[A]], i64 7
+; CHECK-NEXT:    store float [[TMP1]], float* [[ARRAYIDX_I]], align 4, !noalias !16
+; CHECK-NEXT:    [[TMP2:%.*]] = load float, float* [[A]], align 4, !alias.scope !16, !noalias !17
+; CHECK-NEXT:    [[ARRAYIDX_I_I7:%.*]] = getelementptr inbounds float, float* [[B]], i64 5
+; CHECK-NEXT:    store float [[TMP2]], float* [[ARRAYIDX_I_I7]], align 4, !alias.scope !21, !noalias !22
+; CHECK-NEXT:    [[ARRAYIDX1_I_I8:%.*]] = getelementptr inbounds float, float* [[B]], i64 8
+; CHECK-NEXT:    store float [[TMP2]], float* [[ARRAYIDX1_I_I8]], align 4, !alias.scope !23, !noalias !24
+; CHECK-NEXT:    [[TMP3:%.*]] = load float, float* [[A]], align 4, !alias.scope !16
+; CHECK-NEXT:    [[ARRAYIDX_I9:%.*]] = getelementptr inbounds float, float* [[B]], i64 7
+; CHECK-NEXT:    store float [[TMP3]], float* [[ARRAYIDX_I9]], align 4, !alias.scope !16
+; CHECK-NEXT:    [[TMP4:%.*]] = load float, float* [[C]], align 4
+; CHECK-NEXT:    [[ARRAYIDX_I_I4:%.*]] = getelementptr inbounds float, float* [[A]], i64 5
+; CHECK-NEXT:    store float [[TMP4]], float* [[ARRAYIDX_I_I4]], align 4
+; CHECK-NEXT:    [[ARRAYIDX1_I_I5:%.*]] = getelementptr inbounds float, float* [[B]], i64 8
+; CHECK-NEXT:    store float [[TMP4]], float* [[ARRAYIDX1_I_I5]], align 4
+; CHECK-NEXT:    [[TMP5:%.*]] = load float, float* [[C]], align 4
+; CHECK-NEXT:    [[ARRAYIDX_I6:%.*]] = getelementptr inbounds float, float* [[A]], i64 7
+; CHECK-NEXT:    store float [[TMP5]], float* [[ARRAYIDX_I6]], align 4
+; CHECK-NEXT:    [[TMP6:%.*]] = load float, float* [[A]], align 4
+; CHECK-NEXT:    [[ARRAYIDX_I_I1:%.*]] = getelementptr inbounds float, float* [[B]], i64 5
+; CHECK-NEXT:    store float [[TMP6]], float* [[ARRAYIDX_I_I1]], align 4
+; CHECK-NEXT:    [[ARRAYIDX1_I_I2:%.*]] = getelementptr inbounds float, float* [[B]], i64 8
+; CHECK-NEXT:    store float [[TMP6]], float* [[ARRAYIDX1_I_I2]], align 4
+; CHECK-NEXT:    [[TMP7:%.*]] = load float, float* [[A]], align 4
+; CHECK-NEXT:    [[ARRAYIDX_I3:%.*]] = getelementptr inbounds float, float* [[B]], i64 7
+; CHECK-NEXT:    store float [[TMP7]], float* [[ARRAYIDX_I3]], align 4
+; CHECK-NEXT:    ret void
+;
+entry:
+  call void @callee_with_metadata(float* %a, float* %b, float* %c), !noalias !0
+  call void @callee_with_metadata(float* %b, float* %b, float* %a), !alias.scope !0
+  call void @callee_without_metadata(float* %a, float* %b, float* %c), !noalias !0
+  call void @callee_without_metadata(float* %b, float* %b, float* %a), !alias.scope !0
+  ret void
+}
 
 attributes #0 = { nounwind uwtable }