https://bugs.llvm.org/show_bug.cgi?id=36519

            Bug ID: 36519
           Summary: Regression: br_cc not formed after r325892
           Product: libraries
           Version: trunk
          Hardware: PC
                OS: All
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: Common Code Generator Code
          Assignee: unassignedb...@nondot.org
          Reporter: qcolom...@apple.com
                CC: llvm-bugs@lists.llvm.org

Created attachment 19963
  --> https://bugs.llvm.org/attachment.cgi?id=19963&action=edit
Reproducer

Author: deadalnix
Date: Fri Feb 23 03:50:42 2018
New Revision: 325892

URL: http://llvm.org/viewvc/llvm-project?rev=325892&view=rev
Log:
[DAGCOmbine] Ensure that (brcond (setcc ...)) is handled in a canonical manner.

Summary:
There are transformation that change setcc into other constructs, and transform
that try to reconstruct a setcc from the brcond condition. Depending on what
order these transform are done, the end result differs.

Most of the time, it is preferable to get a setcc as a brcond argument (and
this is why brcond try to recreate the setcc in the first place) so we ensure
this is done every time by also doing it at the setcc level when the only user
is a brcond.

I am seeing cases where this change has actually the opposite effect than was
what intended, if I understood correctly.

In particular, I am seeing a case where we used to generate brcond(setcc(and))
from brcond(xor(and)), but now we end up with brcond(or(xor)). Thus, we failed
to produce br_cc.

Attached a reproducer:
llc -mtriple powerpc-- reduced.ll -o - -debug-only=isel

You’ll see in the debug output those diffs:
 Optimized legalized selection DAG: %bb.3 't1_false1.split:false1.split'
 SelectionDAG has 16 nodes:
   t0: ch = EntryToken
-        t8: i1,ch = CopyFromReg t0, Register:i1 %3
+          t8: i1,ch = CopyFromReg t0, Register:i1 %3
+        t16: i1 = xor t8, Constant:i1<-1>
           t2: f32,ch = CopyFromReg t0, Register:f32 %0
           t4: f32,ch = CopyFromReg t0, Register:f32 %1
-        t6: i1 = setcc t2, t4, setolt:ch
-      t9: i1 = and t8, t6
-    t18: ch = br_cc t0, setne:ch, t9, Constant:i1<-1>,
BasicBlock:ch<true2.exitStub 0x7fbf0885d538>
-  t15: ch = br t18, BasicBlock:ch<false2.exitStub 0x7fbf0885d5f8>
+        t21: i1 = setcc t2, t4, setuge:ch
+      t18: i1 = or t16, t21
+    t19: ch = brcond t0, t18, BasicBlock:ch<true2.exitStub 0x7fbf78053138> ###
<— we don’t get a br_cc anymore
+  t15: ch = br t19, BasicBlock:ch<false2.exitStub 0x7fbf780531f8>

-- 
You are receiving this mail because:
You are on the CC list for the bug.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to