mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +01:00
bpf: Improve expanding logic in LowerSELECT_CC
LowerSELECT_CC is not generating optimal Select_Ri pattern at the moment. It is not guaranteed to place ConstantNode at RHS which would miss matching Select_Ri. A new testcase added into the existing select_ri.ll, also there is an existing case in cmp.ll which would be improved to use Select_Ri after this patch, it is adjusted accordingly. Reported-by: Alexei Starovoitov <alexei.starovoitov@gmail.com> Reviewed-by: Yonghong Song <yhs@fb.com> Signed-off-by: Jiong Wang <jiong.wang@netronome.com> llvm-svn: 324560
This commit is contained in:
parent
31b9403c70
commit
3a27a2b0ca
@ -488,6 +488,11 @@ SDValue BPFTargetLowering::LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const {
|
||||
SDValue TargetCC = DAG.getConstant(CC, DL, MVT::i64);
|
||||
|
||||
SDVTList VTs = DAG.getVTList(Op.getValueType(), MVT::Glue);
|
||||
|
||||
// The constant is expected at RHS in Select_Ri pattern.
|
||||
if (isa<ConstantSDNode>(LHS.getNode()))
|
||||
std::swap(LHS, RHS);
|
||||
|
||||
SDValue Ops[] = {LHS, RHS, TargetCC, TrueV, FalseV};
|
||||
|
||||
return DAG.getNode(BPFISD::SELECT_CC, DL, VTs, Ops);
|
||||
|
@ -97,7 +97,7 @@ define zeroext i8 @minu(i8 zeroext %a, i8 zeroext %b) #0 {
|
||||
%a.b = select i1 %1, i8 %a, i8 %b
|
||||
ret i8 %a.b
|
||||
; CHECK-LABEL:minu:
|
||||
; CHECK: if r3 > r1
|
||||
; CHECK: if r{{[0-9]+}} {{<|>}} 100
|
||||
}
|
||||
|
||||
; Function Attrs: nounwind readnone uwtable
|
||||
|
@ -60,3 +60,28 @@ define i32 @foo(i8*) local_unnamed_addr #0 {
|
||||
|
||||
; Function Attrs: nounwind readonly
|
||||
declare i64 @llvm.bpf.load.word(i8*, i64) #1
|
||||
|
||||
; Source file:
|
||||
; int m, n;
|
||||
; int test2() {
|
||||
; int a = m;
|
||||
; if (a < 6)
|
||||
; a = n;
|
||||
; return a;
|
||||
; }
|
||||
|
||||
@m = common local_unnamed_addr global i32 0, align 4
|
||||
@n = common local_unnamed_addr global i32 0, align 4
|
||||
|
||||
; Function Attrs: norecurse nounwind readonly
|
||||
define i32 @test2() local_unnamed_addr #0 {
|
||||
entry:
|
||||
%0 = load i32, i32* @m, align 4
|
||||
%cmp = icmp slt i32 %0, 6
|
||||
; CHECK: if r{{[0-9]+}} s{{<|>}} 6 goto
|
||||
%1 = load i32, i32* @n, align 4
|
||||
%spec.select = select i1 %cmp, i32 %1, i32 %0
|
||||
ret i32 %spec.select
|
||||
}
|
||||
|
||||
attributes #0 = { norecurse nounwind readonly }
|
||||
|
Loading…
Reference in New Issue
Block a user