Files
clang-p2996/llvm/test/Transforms/PhaseOrdering/X86/pr52289.ll
Anton Afanasyev c34d157fc7 [Passes] Move AggressiveInstCombine after InstCombine
Swap AIC and IC neighbouring in pipeline. This looks more natural and even
almost has no effect for now (three slightly touched tests of test-suite). Also
this could be the first step towards merging AIC (or its part) to -O2 pipeline.

After several changes in AIC (like D108091, D108201, D107766, D109515, D109236)
there've been observed several regressions (like PR52078, PR52253, PR52289)
that were fixed in different passes (see D111330, D112721) by extending their
functionality, but these regressions were exposed since changed AIC prevents IC
from making some of early optimizations.

This is common problem and it should be fixed by just moving AIC after IC
which looks more logically by itself: make aggressive instruction combining
only after failed ordinary one.

Fixes PR52289

Reviewed By: spatel, RKSimon

Differential Revision: https://reviews.llvm.org/D113179
2021-12-04 14:22:43 +03:00

45 lines
1.0 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -O3 -S < %s | FileCheck %s
target datalayout = "n8:16:32:64"
define i32 @main(i32 %a) {
; CHECK-LABEL: @main(
; CHECK-NEXT: if.end:
; CHECK-NEXT: ret i32 0
;
%inc = add nsw i32 %a, 1
%and = and i32 %inc, 8
%conv = trunc i32 %and to i8
%call = call fastcc i8 @a(i8 %conv, i32 7)
%conv1 = sext i8 %call to i64
%call2 = call fastcc i64 @d(i64 %conv1)
%mul = mul nsw i64 %call2, 20681
%conv3 = trunc i64 %mul to i16
%conv4 = sext i16 %conv3 to i32
%xor = xor i32 %conv4, 1
%tobool = icmp ne i32 %xor, 0
br i1 %tobool, label %if.end, label %if.then
if.then:
call void undef()
br label %if.end
if.end:
%call5 = call fastcc i8 @a(i8 0, i32 0)
ret i32 0
}
define internal fastcc i8 @a(i8 %h, i32 %i) {
%t0 = zext i8 %h to i32
%cmp = icmp sgt i32 %t0, %i
%shl = shl i32 %t0, %i
%cond = select i1 %cmp, i32 %t0, i32 %shl
%conv4 = trunc i32 %cond to i8
ret i8 %conv4
}
define internal fastcc i64 @d(i64 %h) {
ret i64 %h
}