llvm-project/llvm/test/Transforms/InstCombine/assume-icmp-null-select.ll
Roman Lebedev 4def99e642
[InstCombine] Try to fold not into cmp iff other users of cmp are freely invertible
There is still some such patterns that require collaboration
of folds to handle,that we don't currently do.
2022-12-19 00:24:28 +03:00

43 lines
1.3 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt < %s -passes=instcombine -S | FileCheck %s
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
define ptr @example(ptr dereferenceable(24) %x) {
; CHECK-LABEL: @example(
; CHECK-NEXT: ret ptr [[X:%.*]]
;
%y = load ptr, ptr %x, align 8
%y_is_null = icmp eq ptr %y, null
%res = select i1 %y_is_null, ptr null, ptr %x
%nonnull = icmp ne ptr %res, null
call void @llvm.assume(i1 %nonnull)
ret ptr %res
}
; TODO: this should be folded to `ret ptr %x` as well.
define ptr @example2(ptr %x) {
; CHECK-LABEL: @example2(
; CHECK-NEXT: [[Y:%.*]] = load ptr, ptr [[X:%.*]], align 8
; CHECK-NEXT: [[Y_IS_NULL:%.*]] = icmp eq ptr [[Y]], null
; CHECK-NEXT: [[RES:%.*]] = select i1 [[Y_IS_NULL]], ptr null, ptr [[X]]
; CHECK-NEXT: [[NONNULL:%.*]] = icmp ne ptr [[RES]], null
; CHECK-NEXT: call void @llvm.assume(i1 [[NONNULL]])
; CHECK-NEXT: ret ptr [[RES]]
;
%y = load ptr, ptr %x, align 8
%y_is_null = icmp eq ptr %y, null
%res = select i1 %y_is_null, ptr null, ptr %x
%nonnull = icmp ne ptr %res, null
call void @llvm.assume(i1 %nonnull)
ret ptr %res
}
declare void @llvm.assume(i1)