Changeset View
Standalone View
test/CodeGen/X86/jump_sign.ll
Show First 20 Lines • Show All 230 Lines • ▼ Show 20 Lines | |||||
; CHECK-NEXT: testb %al, %al | ; CHECK-NEXT: testb %al, %al | ||||
; CHECK-NEXT: jne .LBB12_5 | ; CHECK-NEXT: jne .LBB12_5 | ||||
; CHECK-NEXT: # %bb.3: # %sw.bb | ; CHECK-NEXT: # %bb.3: # %sw.bb | ||||
; CHECK-NEXT: xorl %eax, %eax | ; CHECK-NEXT: xorl %eax, %eax | ||||
; CHECK-NEXT: testb %al, %al | ; CHECK-NEXT: testb %al, %al | ||||
; CHECK-NEXT: jne .LBB12_8 | ; CHECK-NEXT: jne .LBB12_8 | ||||
; CHECK-NEXT: # %bb.4: # %if.end29 | ; CHECK-NEXT: # %bb.4: # %if.end29 | ||||
; CHECK-NEXT: movzwl (%eax), %eax | ; CHECK-NEXT: movzwl (%eax), %eax | ||||
; CHECK-NEXT: imull $-13107, %eax, %eax # imm = 0xCCCD | |||||
; CHECK-NEXT: rorw $1, %ax | |||||
; CHECK-NEXT: movzwl %ax, %eax | ; CHECK-NEXT: movzwl %ax, %eax | ||||
; CHECK-NEXT: imull $52429, %eax, %ecx # imm = 0xCCCD | ; CHECK-NEXT: cmpl $13108, %eax # imm = 0x3334 | ||||
; CHECK-NEXT: shrl $19, %ecx | ; CHECK-NEXT: jae .LBB12_5 | ||||
; CHECK-NEXT: addl %ecx, %ecx | |||||
; CHECK-NEXT: leal (%ecx,%ecx,4), %ecx | |||||
; CHECK-NEXT: cmpw %cx, %ax | |||||
; CHECK-NEXT: jne .LBB12_5 | |||||
; CHECK-NEXT: .LBB12_8: # %if.then44 | ; CHECK-NEXT: .LBB12_8: # %if.then44 | ||||
lebedev.ri: What do you mean by breaks? Is this a miscompilation? | |||||
Not Done ReplyInline ActionsOh my bad, to clarify: I was referring to test1 in this file and not the one that's changed here. This one is fine, but the code produced for test1 after this patch would be less optimal than before. The output of BuildUREMEqFold just doesn't seem to fall into patterns that we're already optimizing well in this particular case (N is extended from i1, then AND'ed and then passed into an UREM), and we'd probably have to do a new KnownBits-based optimization elsewhere to avoid this. Via InstCombine this can actually be fixed without close to no extra overhead because we are already computing the necessary bits anyway. hermord: Oh my bad, to clarify: I was referring to `test1` in this file and not the one that's changed… | |||||
; CHECK-NEXT: xorl %eax, %eax | ; CHECK-NEXT: xorl %eax, %eax | ||||
; CHECK-NEXT: testb %al, %al | ; CHECK-NEXT: testb %al, %al | ||||
; CHECK-NEXT: je .LBB12_9 | ; CHECK-NEXT: je .LBB12_9 | ||||
; CHECK-NEXT: # %bb.10: # %if.else.i104 | ; CHECK-NEXT: # %bb.10: # %if.else.i104 | ||||
; CHECK-NEXT: retl | ; CHECK-NEXT: retl | ||||
; CHECK-NEXT: .LBB12_5: # %sw.default | ; CHECK-NEXT: .LBB12_5: # %sw.default | ||||
; CHECK-NEXT: xorl %eax, %eax | ; CHECK-NEXT: xorl %eax, %eax | ||||
; CHECK-NEXT: testb %al, %al | ; CHECK-NEXT: testb %al, %al | ||||
▲ Show 20 Lines • Show All 138 Lines • ▼ Show 20 Lines | |||||
} | } | ||||
; PR13966 | ; PR13966 | ||||
@b = common global i32 0, align 4 | @b = common global i32 0, align 4 | ||||
@a = common global i32 0, align 4 | @a = common global i32 0, align 4 | ||||
define i32 @func_test1(i32 %p1) nounwind uwtable { | define i32 @func_test1(i32 %p1) nounwind uwtable { | ||||
; CHECK-LABEL: func_test1: | ; CHECK-LABEL: func_test1: | ||||
; CHECK: # %bb.0: # %entry | ; CHECK: # %bb.0: # %entry | ||||
; CHECK-NEXT: movl b, %eax | ; CHECK-NEXT: movl b, %ecx | ||||
; CHECK-NEXT: cmpl {{[0-9]+}}(%esp), %eax | ; CHECK-NEXT: xorl %eax, %eax | ||||
; CHECK-NEXT: setb %cl | ; CHECK-NEXT: cmpl {{[0-9]+}}(%esp), %ecx | ||||
; CHECK-NEXT: movl a, %eax | ; CHECK-NEXT: setb %al | ||||
; CHECK-NEXT: testb %al, %cl | ; CHECK-NEXT: movl a, %ecx | ||||
; CHECK-NEXT: je .LBB18_2 | ; CHECK-NEXT: andl %ecx, %eax | ||||
; CHECK-NEXT: movb $-85, %dl | |||||
Not Done ReplyInline ActionsThis is the test1 regression I mentioned in previous updates. I've made it explicit now, for the lack of a clean fix that I can see (without computeKnownBits). hermord: This is the `test1` regression I mentioned in previous updates. I've made it explicit now, for… | |||||
Not Done ReplyInline ActionsHave you made any progress working out what the problems is with test1? RKSimon: Have you made any progress working out what the problems is with test1? | |||||
; CHECK-NEXT: # kill: def $al killed $al killed $eax | |||||
; CHECK-NEXT: mulb %dl | |||||
; CHECK-NEXT: cmpb $86, %al | |||||
; CHECK-NEXT: jb .LBB18_2 | |||||
; CHECK-NEXT: # %bb.1: # %if.then | ; CHECK-NEXT: # %bb.1: # %if.then | ||||
; CHECK-NEXT: decl %eax | ; CHECK-NEXT: decl %ecx | ||||
; CHECK-NEXT: movl %eax, a | ; CHECK-NEXT: movl %ecx, a | ||||
; CHECK-NEXT: .LBB18_2: # %if.end | ; CHECK-NEXT: .LBB18_2: # %if.end | ||||
; CHECK-NEXT: retl | ; CHECK-NEXT: retl | ||||
entry: | entry: | ||||
%t0 = load i32, i32* @b, align 4 | %t0 = load i32, i32* @b, align 4 | ||||
%cmp = icmp ult i32 %t0, %p1 | %cmp = icmp ult i32 %t0, %p1 | ||||
%conv = zext i1 %cmp to i32 | %conv = zext i1 %cmp to i32 | ||||
%t1 = load i32, i32* @a, align 4 | %t1 = load i32, i32* @a, align 4 | ||||
%and = and i32 %conv, %t1 | %and = and i32 %conv, %t1 | ||||
Show All 16 Lines |
What do you mean by breaks? Is this a miscompilation?