diff options
Diffstat (limited to 'llvm/test/CodeGen/SystemZ')
-rw-r--r-- | llvm/test/CodeGen/SystemZ/int-cmp-44.ll | 59 | ||||
-rw-r--r-- | llvm/test/CodeGen/SystemZ/int-cmp-45.ll | 27 | ||||
-rw-r--r-- | llvm/test/CodeGen/SystemZ/int-cmp-56.ll | 163 | ||||
-rw-r--r-- | llvm/test/CodeGen/SystemZ/int-cmp-57.ll | 103 | ||||
-rw-r--r-- | llvm/test/CodeGen/SystemZ/int-cmp-58.mir | 71 |
5 files changed, 379 insertions, 44 deletions
diff --git a/llvm/test/CodeGen/SystemZ/int-cmp-44.ll b/llvm/test/CodeGen/SystemZ/int-cmp-44.ll index 45bb32b9ce6..2321b7d16a2 100644 --- a/llvm/test/CodeGen/SystemZ/int-cmp-44.ll +++ b/llvm/test/CodeGen/SystemZ/int-cmp-44.ll @@ -6,15 +6,16 @@ declare void @foo() -; Addition provides enough for equality comparisons with zero. First teest -; the EQ case. +; Addition provides enough for comparisons with zero if we know no +; signed overflow happens, which is when the "nsw" flag is set. +; First test the EQ case. define i32 @f1(i32 %a, i32 %b, i32 *%dest) { ; CHECK-LABEL: f1: ; CHECK: afi %r2, 1000000 ; CHECK-NEXT: ber %r14 ; CHECK: br %r14 entry: - %res = add i32 %a, 1000000 + %res = add nsw i32 %a, 1000000 %cmp = icmp eq i32 %res, 0 br i1 %cmp, label %exit, label %store @@ -30,10 +31,10 @@ exit: define i32 @f2(i32 %a, i32 %b, i32 *%dest) { ; CHECK-LABEL: f2: ; CHECK: afi %r2, 1000000 -; CHECK-NEXT: bner %r14 +; CHECK-NEXT: blhr %r14 ; CHECK: br %r14 entry: - %res = add i32 %a, 1000000 + %res = add nsw i32 %a, 1000000 %cmp = icmp ne i32 %res, 0 br i1 %cmp, label %exit, label %store @@ -45,14 +46,13 @@ exit: ret i32 %res } -; SLT requires a comparison. +; ...and again with SLT. define i32 @f3(i32 %a, i32 %b, i32 *%dest) { ; CHECK-LABEL: f3: ; CHECK: afi %r2, 1000000 -; CHECK-NEXT: cibl %r2, 0, 0(%r14) -; CHECK: br %r14 +; CHECK-NEXT: blr %r14 entry: - %res = add i32 %a, 1000000 + %res = add nsw i32 %a, 1000000 %cmp = icmp slt i32 %res, 0 br i1 %cmp, label %exit, label %store @@ -64,14 +64,13 @@ exit: ret i32 %res } -; ...SLE too. +; ...and again with SLE. define i32 @f4(i32 %a, i32 %b, i32 *%dest) { ; CHECK-LABEL: f4: ; CHECK: afi %r2, 1000000 -; CHECK-NEXT: cible %r2, 0, 0(%r14) -; CHECK: br %r14 +; CHECK-NEXT: bler %r14 entry: - %res = add i32 %a, 1000000 + %res = add nsw i32 %a, 1000000 %cmp = icmp sle i32 %res, 0 br i1 %cmp, label %exit, label %store @@ -83,14 +82,13 @@ exit: ret i32 %res } -; ...SGT too. +; ...and again with SGT. define i32 @f5(i32 %a, i32 %b, i32 *%dest) { ; CHECK-LABEL: f5: ; CHECK: afi %r2, 1000000 -; CHECK-NEXT: cibh %r2, 0, 0(%r14) -; CHECK: br %r14 +; CHECK-NEXT: bhr %r14 entry: - %res = add i32 %a, 1000000 + %res = add nsw i32 %a, 1000000 %cmp = icmp sgt i32 %res, 0 br i1 %cmp, label %exit, label %store @@ -102,14 +100,13 @@ exit: ret i32 %res } -; ...SGE too. +; ...and again with SGE. define i32 @f6(i32 %a, i32 %b, i32 *%dest) { ; CHECK-LABEL: f6: ; CHECK: afi %r2, 1000000 -; CHECK-NEXT: cibhe %r2, 0, 0(%r14) -; CHECK: br %r14 +; CHECK-NEXT: bher %r14 entry: - %res = add i32 %a, 1000000 + %res = add nsw i32 %a, 1000000 %cmp = icmp sge i32 %res, 0 br i1 %cmp, label %exit, label %store @@ -121,7 +118,8 @@ exit: ret i32 %res } -; Subtraction also provides enough for equality comparisons with zero. +; Subtraction provides in addition also enough for equality comparisons with +; zero even without "nsw". define i32 @f7(i32 %a, i32 %b, i32 *%dest) { ; CHECK-LABEL: f7: ; CHECK: s %r2, 0(%r4) @@ -141,15 +139,14 @@ exit: ret i32 %res } -; ...but not for ordered comparisons. +; ...and again with SLT. define i32 @f8(i32 %a, i32 %b, i32 *%dest) { ; CHECK-LABEL: f8: ; CHECK: s %r2, 0(%r4) -; CHECK-NEXT: cibl %r2, 0, 0(%r14) -; CHECK: br %r14 +; CHECK-NEXT: blr %r14 entry: %cur = load i32, i32 *%dest - %res = sub i32 %a, %cur + %res = sub nsw i32 %a, %cur %cmp = icmp slt i32 %res, 0 br i1 %cmp, label %exit, label %store @@ -445,10 +442,10 @@ define i32 @f23(i32 %a, i32 %b, i32 *%dest1, i32 *%dest2) { ; CHECK-LABEL: f23: ; CHECK: afi %r2, 1000000 ; CHECK-NEXT: st %r2, 0(%r4) -; CHECK-NEXT: bner %r14 +; CHECK-NEXT: blhr %r14 ; CHECK: br %r14 entry: - %res = add i32 %a, 1000000 + %res = add nsw i32 %a, 1000000 store i32 %res, i32 *%dest1 %cmp = icmp ne i32 %res, 0 br i1 %cmp, label %exit, label %store @@ -491,10 +488,10 @@ define void @f25(i32 %a, i32 *%ptr) { ; CHECK-NEXT: #APP ; CHECK-NEXT: blah ; CHECK-NEXT: #NO_APP -; CHECK-NEXT: bner %r14 +; CHECK-NEXT: blhr %r14 ; CHECK: br %r14 entry: - %add = add i32 %a, 1000000 + %add = add nsw i32 %a, 1000000 call void asm sideeffect "blah", "r"(i32 %add) %cmp = icmp ne i32 %add, 0 br i1 %cmp, label %exit, label %store @@ -540,7 +537,7 @@ define i32 @f27(i32 %a, i32 %b, i32 *%dest1, i32 *%dest2) { ; CHECK-NEXT: cibe %r2, 0, 0(%r14) ; CHECK: br %r14 entry: - %add = add i32 %a, 1000000 + %add = add nsw i32 %a, 1000000 %sub = sub i32 %b, %add store i32 %sub, i32 *%dest1 %cmp = icmp eq i32 %add, 0 diff --git a/llvm/test/CodeGen/SystemZ/int-cmp-45.ll b/llvm/test/CodeGen/SystemZ/int-cmp-45.ll index e07d37e571b..296cf449742 100644 --- a/llvm/test/CodeGen/SystemZ/int-cmp-45.ll +++ b/llvm/test/CodeGen/SystemZ/int-cmp-45.ll @@ -3,14 +3,15 @@ ; ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z196 -no-integrated-as | FileCheck %s -; Addition provides enough for equality comparisons with zero. First teest -; the EQ case with LOC. +; Addition provides enough for comparisons with zero if we know no +; signed overflow happens, which is when the "nsw" flag is set. +; First test the EQ case with LOC. define i32 @f1(i32 %a, i32 %b, i32 *%cptr) { ; CHECK-LABEL: f1: ; CHECK: afi %r2, 1000000 ; CHECK-NEXT: loce %r3, 0(%r4) ; CHECK: br %r14 - %add = add i32 %a, 1000000 + %add = add nsw i32 %a, 1000000 %cmp = icmp eq i32 %add, 0 %c = load i32, i32 *%cptr %arg = select i1 %cmp, i32 %c, i32 %b @@ -24,7 +25,7 @@ define i32 @f2(i32 %a, i32 %b, i32 *%cptr) { ; CHECK: afi %r2, 1000000 ; CHECK-NEXT: stoce %r3, 0(%r4) ; CHECK: br %r14 - %add = add i32 %a, 1000000 + %add = add nsw i32 %a, 1000000 %cmp = icmp eq i32 %add, 0 %c = load i32, i32 *%cptr %newval = select i1 %cmp, i32 %b, i32 %c @@ -36,9 +37,9 @@ define i32 @f2(i32 %a, i32 %b, i32 *%cptr) { define i32 @f3(i32 %a, i32 %b, i32 %c) { ; CHECK-LABEL: f3: ; CHECK: afi %r2, 1000000 -; CHECK-NEXT: locrne %r3, %r4 +; CHECK-NEXT: locrlh %r3, %r4 ; CHECK: br %r14 - %add = add i32 %a, 1000000 + %add = add nsw i32 %a, 1000000 %cmp = icmp eq i32 %add, 0 %arg = select i1 %cmp, i32 %b, i32 %c call void asm sideeffect "blah $0", "{r3}"(i32 %arg) @@ -49,9 +50,9 @@ define i32 @f3(i32 %a, i32 %b, i32 %c) { define i32 @f4(i32 %a, i32 %b, i32 *%cptr) { ; CHECK-LABEL: f4: ; CHECK: afi %r2, 1000000 -; CHECK-NEXT: locne %r3, 0(%r4) +; CHECK-NEXT: loclh %r3, 0(%r4) ; CHECK: br %r14 - %add = add i32 %a, 1000000 + %add = add nsw i32 %a, 1000000 %cmp = icmp eq i32 %add, 0 %c = load i32, i32 *%cptr %arg = select i1 %cmp, i32 %b, i32 %c @@ -63,9 +64,9 @@ define i32 @f4(i32 %a, i32 %b, i32 *%cptr) { define i32 @f5(i32 %a, i32 %b, i32 *%cptr) { ; CHECK-LABEL: f5: ; CHECK: afi %r2, 1000000 -; CHECK-NEXT: stocne %r3, 0(%r4) +; CHECK-NEXT: stoclh %r3, 0(%r4) ; CHECK: br %r14 - %add = add i32 %a, 1000000 + %add = add nsw i32 %a, 1000000 %cmp = icmp eq i32 %add, 0 %c = load i32, i32 *%cptr %newval = select i1 %cmp, i32 %c, i32 %b @@ -79,7 +80,7 @@ define i32 @f6(i32 %a, i32 %b, i32 %c) { ; CHECK: afi %r2, 1000000 ; CHECK-NEXT: locre %r3, %r4 ; CHECK: br %r14 - %add = add i32 %a, 1000000 + %add = add nsw i32 %a, 1000000 %cmp = icmp ne i32 %add, 0 %arg = select i1 %cmp, i32 %b, i32 %c call void asm sideeffect "blah $0", "{r3}"(i32 %arg) @@ -92,7 +93,7 @@ define i32 @f7(i32 %a, i32 %b, i32 *%cptr) { ; CHECK: afi %r2, 1000000 ; CHECK-NEXT: loce %r3, 0(%r4) ; CHECK: br %r14 - %add = add i32 %a, 1000000 + %add = add nsw i32 %a, 1000000 %cmp = icmp ne i32 %add, 0 %c = load i32, i32 *%cptr %arg = select i1 %cmp, i32 %b, i32 %c @@ -106,7 +107,7 @@ define i32 @f8(i32 %a, i32 %b, i32 *%cptr) { ; CHECK: afi %r2, 1000000 ; CHECK-NEXT: stoce %r3, 0(%r4) ; CHECK: br %r14 - %add = add i32 %a, 1000000 + %add = add nsw i32 %a, 1000000 %cmp = icmp ne i32 %add, 0 %c = load i32, i32 *%cptr %newval = select i1 %cmp, i32 %c, i32 %b diff --git a/llvm/test/CodeGen/SystemZ/int-cmp-56.ll b/llvm/test/CodeGen/SystemZ/int-cmp-56.ll new file mode 100644 index 00000000000..5b55e4a819d --- /dev/null +++ b/llvm/test/CodeGen/SystemZ/int-cmp-56.ll @@ -0,0 +1,163 @@ +; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s +; +; Check that signed comparisons against 0 are only eliminated if the "nsw" +; flag is present on the defining add (with register) instruction. For an +; equality comparison, add logical can be used. + +define i32 @fun0(i32 %arg, i32 %arg2, i32 %arg3) { +; CHECK-LABEL: fun0: +; CHECK: jle .LBB0_2{{$}} +; CHECK: je .LBB0_4{{$}} + +bb: + %tmp2 = add nsw i32 %arg, %arg2 + %tmp3 = icmp sgt i32 %tmp2, 0 + br i1 %tmp3, label %bb3, label %bb1 + +bb1: + %tmp4 = add nsw i32 %arg, %arg3 + %tmp5 = icmp eq i32 %tmp4, 0 + br i1 %tmp5, label %bb4, label %bb2 + +bb2: + ret i32 0 + +bb3: + ret i32 1 + +bb4: + ret i32 2 +} + +; No "nsw" flag +define i32 @fun1(i32 %arg, i32 %arg2, i32 %arg3) { +; CHECK-LABEL: fun1: +; CHECK: cijle +; CHECK: alr +; CHECK: jhe + +bb: + %tmp2 = add i32 %arg, %arg2 + %tmp3 = icmp sgt i32 %tmp2, 0 + br i1 %tmp3, label %bb3, label %bb1 + +bb1: + %tmp4 = add i32 %arg, %arg3 + %tmp5 = icmp eq i32 %tmp4, 0 + br i1 %tmp5, label %bb4, label %bb2 + +bb2: + ret i32 0 + +bb3: + ret i32 1 + +bb4: + ret i32 2 +} + +; "nuw" flag +define i32 @fun2(i32 %arg, i32 %arg2, i32 %arg3) { +; CHECK-LABEL: fun2: +; CHECK: cijle +; CHECK: alr +; CHECK: jhe + +bb: + %tmp2 = add nuw i32 %arg, %arg2 + %tmp3 = icmp sgt i32 %tmp2, 0 + br i1 %tmp3, label %bb3, label %bb1 + +bb1: + %tmp4 = add nuw i32 %arg, %arg3 + %tmp5 = icmp eq i32 %tmp4, 0 + br i1 %tmp5, label %bb4, label %bb2 + +bb2: + ret i32 0 + +bb3: + ret i32 1 + +bb4: + ret i32 2 +} + +; Subtraction does not produce the value of zero in case of overflow, so +; "nsw" is not needed for the equality check against zero. +define i32 @fun3(i32 %arg, i32 %arg2, i32 %arg3) { +; CHECK-LABEL: fun3: +; CHECK: jle .LBB3_2{{$}} +; CHECK: je .LBB3_4{{$}} + +bb: + %tmp2 = sub nsw i32 %arg, %arg2 + %tmp3 = icmp sgt i32 %tmp2, 0 + br i1 %tmp3, label %bb3, label %bb1 + +bb1: + %tmp4 = sub nsw i32 %arg, %arg3 + %tmp5 = icmp eq i32 %tmp4, 0 + br i1 %tmp5, label %bb4, label %bb2 + +bb2: + ret i32 0 + +bb3: + ret i32 1 + +bb4: + ret i32 2 +} + +; No "nsw" flag +define i32 @fun4(i32 %arg, i32 %arg2, i32 %arg3) { +; CHECK-LABEL: fun4: +; CHECK: cijle +; CHECK: je .LBB4_4{{$}} + +bb: + %tmp2 = sub i32 %arg, %arg2 + %tmp3 = icmp sgt i32 %tmp2, 0 + br i1 %tmp3, label %bb3, label %bb1 + +bb1: + %tmp4 = sub i32 %arg, %arg3 + %tmp5 = icmp eq i32 %tmp4, 0 + br i1 %tmp5, label %bb4, label %bb2 + +bb2: + ret i32 0 + +bb3: + ret i32 1 + +bb4: + ret i32 2 +} + +; "nuw" flag +define i32 @fun5(i32 %arg, i32 %arg2, i32 %arg3) { +; CHECK-LABEL: fun5: +; CHECK: cijle +; CHECK: je .LBB5_4{{$}} + +bb: + %tmp2 = sub nuw i32 %arg, %arg2 + %tmp3 = icmp sgt i32 %tmp2, 0 + br i1 %tmp3, label %bb3, label %bb1 + +bb1: + %tmp4 = sub nuw i32 %arg, %arg3 + %tmp5 = icmp eq i32 %tmp4, 0 + br i1 %tmp5, label %bb4, label %bb2 + +bb2: + ret i32 0 + +bb3: + ret i32 1 + +bb4: + ret i32 2 +} diff --git a/llvm/test/CodeGen/SystemZ/int-cmp-57.ll b/llvm/test/CodeGen/SystemZ/int-cmp-57.ll new file mode 100644 index 00000000000..a49edc19655 --- /dev/null +++ b/llvm/test/CodeGen/SystemZ/int-cmp-57.ll @@ -0,0 +1,103 @@ +; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 -disable-cgp | FileCheck %s +; +; Check that signed comparisons against 0 are eliminated if the defining +; instruction is an add with immediate. +; +; Addition of an immediate does not depend on the "nsw" flag, since the +; result can be predicted in case of overflow. For example, if adding a +; positive immediate gives overflow, the result must be negative. + +; Addition of a negative immediate gives a positive result in case of +; overflow (except for the case of the minimum value which may also result in +; a zero result). +define i32 @fun0(i32 %arg) { +; CHECK-LABEL: fun0: +; CHECK: ahik +; CHECK-NEXT: locre +bb: + %tmp = add i32 %arg, -1 + %tmp1 = icmp eq i32 %tmp, 0 + %res = select i1 %tmp1, i32 %tmp, i32 %arg + ret i32 %res +} + +define i32 @fun1(i32 %arg) { +; CHECK-LABEL: fun1: +; CHECK: ahik +; CHECK-NEXT: locrnle +bb: + %tmp = add i32 %arg, -1 + %tmp1 = icmp sgt i32 %tmp, 0 + %res = select i1 %tmp1, i32 %tmp, i32 %arg + ret i32 %res +} + +define i32 @fun2(i32 %arg) { +; CHECK-LABEL: fun2: +; CHECK: ahik +; CHECK-NEXT: locrl +bb: + %tmp = add i32 %arg, -1 + %tmp1 = icmp slt i32 %tmp, 0 + %res = select i1 %tmp1, i32 %tmp, i32 %arg + ret i32 %res +} + +; Addition of a positive immediate gives a negative result in case of overflow. +define i32 @fun3(i32 %arg) { +; CHECK-LABEL: fun3: +; CHECK: ahik +; CHECK-NEXT: locre +bb: + %tmp = add i32 %arg, 1 + %tmp1 = icmp eq i32 %tmp, 0 + %res = select i1 %tmp1, i32 %tmp, i32 %arg + ret i32 %res +} + +define i32 @fun4(i32 %arg) { +; CHECK-LABEL: fun4: +; CHECK: ahik +; CHECK-NEXT: locrh +bb: + %tmp = add i32 %arg, 1 + %tmp1 = icmp sgt i32 %tmp, 0 + %res = select i1 %tmp1, i32 %tmp, i32 %arg + ret i32 %res +} + +define i32 @fun5(i32 %arg) { +; CHECK-LABEL: fun5: +; CHECK: ahik +; CHECK-NEXT: locrnhe +bb: + %tmp = add i32 %arg, 1 + %tmp1 = icmp slt i32 %tmp, 0 + %res = select i1 %tmp1, i32 %tmp, i32 %arg + ret i32 %res +} + +; Addition of the minimum value gives a positive or zero result. +define i32 @fun6(i32 %arg) { +; CHECK-LABEL: fun6: +; CHECK: afi +; CHECK-NEXT: chi +; CHECK-NEXT: locrlh +bb: + %tmp = add i32 %arg, -2147483648 + %tmp1 = icmp eq i32 %tmp, 0 + %res = select i1 %tmp1, i32 %tmp, i32 %arg + ret i32 %res +} + +define i32 @fun7(i32 %arg) { +; CHECK-LABEL: fun7: +; CHECK: afi +; CHECK-NEXT: chi +; CHECK-NEXT: locrle +bb: + %tmp = add i32 %arg, -2147483648 + %tmp1 = icmp sgt i32 %tmp, 0 + %res = select i1 %tmp1, i32 %tmp, i32 %arg + ret i32 %res +} diff --git a/llvm/test/CodeGen/SystemZ/int-cmp-58.mir b/llvm/test/CodeGen/SystemZ/int-cmp-58.mir new file mode 100644 index 00000000000..0cdcbf8181a --- /dev/null +++ b/llvm/test/CodeGen/SystemZ/int-cmp-58.mir @@ -0,0 +1,71 @@ +# RUN: llc -mtriple=s390x-linux-gnu -mcpu=z14 -start-before=postrapseudos %s \ +# RUN: -o - | FileCheck %s +# +# Test that the CC values of logical adds and subs can be used in compare +# elimination in the cases of EQ/NE. + +# CHECK-LABEL: fun0: +# CHECK: alr %r3, %r2 +# CHECK-NEXT: locrhe %r2, %r3 +# CHECK-NEXT: alr %r3, %r2 +# CHECK-NEXT: locrnhe %r2, %r3 +# CHECK-NEXT: alr %r3, %r2 +# CHECK-NEXT: chi %r3, 0 +# CHECK-NEXT: locrle %r2, %r3 +# CHECK-NEXT: alr %r3, %r2 +# CHECK-NEXT: chi %r3, 0 +# CHECK-NEXT: locrhe %r2, %r3 +# CHECK-NEXT: slrk %r3, %r2, %r3 +# CHECK-NEXT: locrh %r2, %r3 +# CHECK-NEXT: slrk %r3, %r2, %r3 +# CHECK-NEXT: locrnhe %r2, %r3 +# CHECK-NEXT: slrk %r3, %r2, %r3 +# CHECK-NEXT: chi %r3, 0 +# CHECK-NEXT: locrle %r2, %r3 +# CHECK-NEXT: slrk %r3, %r2, %r3 +# CHECK-NEXT: chi %r3, 0 +# CHECK-NEXT: locrhe %r2, %r3 + + +--- | + define i32 @fun0(i32 %arg1, i32 %arg2) { bb: ret i32 0 } +... +--- +name: fun0 +body: | + bb.0: + + renamable $r3l = ALRK renamable $r2l, killed renamable $r3l, implicit-def dead $cc + CHIMux renamable $r3l, 0, implicit-def $cc + renamable $r2l = LOCR killed renamable $r2l, killed renamable $r3l, 14, 8, implicit killed $cc + + renamable $r3l = ALRK renamable $r2l, killed renamable $r3l, implicit-def dead $cc + CHIMux renamable $r3l, 0, implicit-def $cc + renamable $r2l = LOCR killed renamable $r2l, killed renamable $r3l, 14, 6, implicit killed $cc + + renamable $r3l = ALRK renamable $r2l, killed renamable $r3l, implicit-def dead $cc + CHIMux renamable $r3l, 0, implicit-def $cc + renamable $r2l = LOCR killed renamable $r2l, killed renamable $r3l, 14, 12, implicit killed $cc + + renamable $r3l = ALRK renamable $r2l, killed renamable $r3l, implicit-def dead $cc + CHIMux renamable $r3l, 0, implicit-def $cc + renamable $r2l = LOCR killed renamable $r2l, killed renamable $r3l, 14, 10, implicit killed $cc + + renamable $r3l = SLRK renamable $r2l, killed renamable $r3l, implicit-def dead $cc + CHIMux renamable $r3l, 0, implicit-def $cc + renamable $r2l = LOCR killed renamable $r2l, killed renamable $r3l, 14, 8, implicit killed $cc + + renamable $r3l = SLRK renamable $r2l, killed renamable $r3l, implicit-def dead $cc + CHIMux renamable $r3l, 0, implicit-def $cc + renamable $r2l = LOCR killed renamable $r2l, killed renamable $r3l, 14, 6, implicit killed $cc + + renamable $r3l = SLRK renamable $r2l, killed renamable $r3l, implicit-def dead $cc + CHIMux renamable $r3l, 0, implicit-def $cc + renamable $r2l = LOCR killed renamable $r2l, killed renamable $r3l, 14, 12, implicit killed $cc + + renamable $r3l = SLRK renamable $r2l, killed renamable $r3l, implicit-def dead $cc + CHIMux renamable $r3l, 0, implicit-def $cc + renamable $r2l = LOCR killed renamable $r2l, killed renamable $r3l, 14, 10, implicit killed $cc + + Return implicit $r2l +... |