Issue 147706
Summary Attributor assigns `!invariant.load` attribute incorrectly
Labels new issue
Assignees
Reporter igogo-x86
    Reproducer:

```
; ModuleID = 'test-invariant.c'
source_filename = "test-invariant.c"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32"
target triple = "aarch64-unknown-linux-gnu"

define void @init(ptr %call) #0 {
	store i32 100, ptr %call, align 4
	ret void
}

define i32 @read(ptr %call) {
  %arrayidx = getelementptr inbounds float, ptr %call, i64 0
 %result = load i32, ptr %arrayidx
	ret i32 %result
}

define i32 @x() {
  %call = alloca i32, align 4
  call void @init(ptr %call)
  %r = call i32 @read(ptr %call)
  ret i32 %r
}

attributes #0 = { noinline }
```

After running `opt -S -passes=attributor,inline,gvn < test-invariant.ll` function `x` returns under and `load i32, ptr %call` gets incorrect `!invaraint.load` attribute:


```
; Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(argmem: write)
define void @init(ptr nofree noundef nonnull writeonly align 4 captures(none) dereferenceable(4) %call) #0 {
  store i32 100, ptr %call, align 4
  ret void
}

; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read)
define i32 @read(ptr nofree nonnull readonly align 4 captures(none) dereferenceable(4) %call) #1 {
  %result = load i32, ptr %call, align 4, !invariant.load !0
 ret i32 %result
}

; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
define i32 @x() #2 {
  %call = alloca i32, align 4
  call void @init(ptr noalias nofree noundef nonnull writeonly align 4 captures(none) dereferenceable(4) %call) #4
  call void @llvm.experimental.noalias.scope.decl(metadata !1)
  ret i32 undef
}

```
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to