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
45 lines
1.0 KiB
LLVM
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
|
|
}
|