<div dir="ltr"><div><div><div><div><div>I'm wondering if someone can shed some light on this (conversely, I have to dig through unfamiliar SDAG code).<br><br></div>The SDAG built out of the following IR inserts a CopyToReg node for parameter %d into the Entry block SDAG. That is perfectly reasonable. However, this being an i1 parameter on a target that passes all integers in wider registers, there needs to be a truncation. The peculiar decision I'm referring to is that the SDAG chooses to insert the truncation into the entry block and then CopyToReg that truncated value. In this specific instance, copying it as a wide integer and then truncating after the CopyFromReg would produce better code.<br></div>So my question is whether this is something that the target can choose easily or whether this is just the standard approach the SDAG takes and can't be readily modified.<br><br></div>The IR in question:<br><span style="font-family:monospace,monospace">define zeroext i1 @_Z18chainedLogicalOps3iiib(i32 signext %a, i32 signext %b, i32 signext %c, i1 zeroext %d) {<br>entry:<br>  %cmp = icmp sgt i32 %a, %b<br>  %cmp1 = icmp slt i32 %b, 0<br>  %or.cond = and i1 %cmp, %cmp1<br>  br i1 %or.cond, label %land.rhs, label %land.end<br><br>land.rhs:                                         ; preds = %entry<br>  %cmp2 = icmp ne i32 %b, %c<br>  %0 = or i1 %cmp2, %d<br>  br label %land.end<br><br>land.end:                                         ; preds = %land.rhs, %entry<br>  %1 = phi i1 [ false, %entry ], [ %0, %land.rhs ]<br>  ret i1 %1<br>}</span><br><br></div>The nodes in the SDAG I am referring to:<br><span style="font-family:monospace,monospace">              t15: i64,ch = CopyFromReg t0, Register:i64 %vreg5<br>            t17: i64 = AssertZext t15, ValueType:ch:i1<br>          t18: i1 = truncate t17<br>        t24: ch = CopyToReg t0, Register:i1 %vreg8, t18<br></span><br></div>If t17 was copied and the truncation inserted in 'land.rhs', my target could make a better ISEL decision.<br></div>