If a call argument has the "returned" attribute, we can simplify the call to the value of that argument. This was already partially handled by InstSimplify/InstCombine for the case where the argument is an integer constant, and the result is thus known via known bits. The non-constant (or non-int) argument cases weren't handled though. This previously landed as an InstSimplify transform, but was reverted due to assertion failures when compiling the Linux kernel. The reason is that simplifying a call to another call breaks assumptions in call graph updating during inlining. As the code is not easy to fix, and there is no particularly strong motivation for having this in InstSimplify, the transform is only performed in InstCombine instead. Differential Revision: https://reviews.llvm.org/D75815
35 lines
886 B
LLVM
35 lines
886 B
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt < %s -instcombine -S | FileCheck %s
|
|
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
|
target triple = "x86_64-unknown-linux-gnu"
|
|
|
|
; Function Attrs: nounwind uwtable
|
|
define i32 @foo1(i32* align 32 %a) #0 {
|
|
; CHECK-LABEL: @foo1(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A:%.*]], align 32
|
|
; CHECK-NEXT: ret i32 [[TMP0]]
|
|
;
|
|
entry:
|
|
%0 = load i32, i32* %a, align 4
|
|
ret i32 %0
|
|
|
|
}
|
|
|
|
define i32 @foo2(i32* align 32 %a) #0 {
|
|
; CHECK-LABEL: @foo2(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: [[V:%.*]] = call i32* @func1(i32* [[A:%.*]])
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[A]], align 32
|
|
; CHECK-NEXT: ret i32 [[TMP0]]
|
|
;
|
|
entry:
|
|
%v = call i32* @func1(i32* %a)
|
|
%0 = load i32, i32* %v, align 4
|
|
ret i32 %0
|
|
|
|
}
|
|
|
|
declare i32* @func1(i32* returned) nounwind
|
|
|