As the test diffs show, the current users of getBinOpIdentity() are InstCombine and Reassociate. SLP vectorizer is a candidate for using this functionality too (D28907). The InstCombine shuffle improvements are part of the planned enhancements noted in D48830. InstCombine actually has several other uses of getBinOpIdentity() via SimplifyUsingDistributiveLaws(), but we don't call that for any FP ops. Fixing that might be another part of removing the custom reassociation in InstCombine that is only done for fadd+fmul. llvm-svn: 336215
72 lines
1.4 KiB
LLVM
72 lines
1.4 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt < %s -reassociate -S | FileCheck %s
|
|
|
|
; Don't produce an instruction that is a no-op because the constant is an identity constant.
|
|
|
|
define i32 @add_0(i32 %x) {
|
|
; CHECK-LABEL: @add_0(
|
|
; CHECK-NEXT: ret i32 [[X:%.*]]
|
|
;
|
|
%a1 = add i32 %x, -30
|
|
%a2 = add i32 %a1, 30
|
|
ret i32 %a2
|
|
}
|
|
|
|
define i32 @mul_1(i32 %x) {
|
|
; CHECK-LABEL: @mul_1(
|
|
; CHECK-NEXT: ret i32 [[X:%.*]]
|
|
;
|
|
%a1 = mul i32 %x, -1
|
|
%a2 = mul i32 %a1, -1
|
|
ret i32 %a2
|
|
}
|
|
|
|
define i8 @and_neg1(i8 %x) {
|
|
; CHECK-LABEL: @and_neg1(
|
|
; CHECK-NEXT: ret i8 [[X:%.*]]
|
|
;
|
|
%a1 = and i8 %x, 255
|
|
%a2 = and i8 %a1, 255
|
|
ret i8 %a2
|
|
}
|
|
|
|
define i8 @or_0(i8 %x) {
|
|
; CHECK-LABEL: @or_0(
|
|
; CHECK-NEXT: ret i8 [[X:%.*]]
|
|
;
|
|
%a1 = or i8 %x, 0
|
|
%a2 = or i8 %a1, 0
|
|
ret i8 %a2
|
|
}
|
|
|
|
define i8 @xor_0(i8 %x) {
|
|
; CHECK-LABEL: @xor_0(
|
|
; CHECK-NEXT: ret i8 [[X:%.*]]
|
|
;
|
|
%a1 = xor i8 %x, 42
|
|
%a2 = xor i8 %a1, 42
|
|
ret i8 %a2
|
|
}
|
|
|
|
; FIXME - the binop identity constant for fadd is -0.0, so this didn't fold.
|
|
|
|
define float @fadd_0(float %x) {
|
|
; CHECK-LABEL: @fadd_0(
|
|
; CHECK-NEXT: [[A2:%.*]] = fadd fast float [[X:%.*]], 0.000000e+00
|
|
; CHECK-NEXT: ret float [[A2]]
|
|
;
|
|
%a1 = fadd fast float %x, -30.0
|
|
%a2 = fadd fast float %a1, 30.0
|
|
ret float %a2
|
|
}
|
|
|
|
define float @fmul_1(float %x) {
|
|
; CHECK-LABEL: @fmul_1(
|
|
; CHECK-NEXT: ret float [[X:%.*]]
|
|
;
|
|
%a1 = fmul fast float %x, 4.0
|
|
%a2 = fmul fast float %a1, 0.25
|
|
ret float %a2
|
|
}
|
|
|