1 ; Test LOCR and LOCGR. 2 ; 3 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z196 -verify-machineinstrs | FileCheck %s 4 ; 5 ; Run the test again to make sure it still works the same even 6 ; in the presence of the load-store-on-condition-2 facility. 7 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 -verify-machineinstrs | FileCheck %s 8 9 ; Test LOCR. 10 define i32 @f1(i32 %a, i32 %b, i32 %limit) { 11 ; CHECK-LABEL: f1: 12 ; CHECK: clfi %r4, 42 13 ; CHECK: locrhe %r2, %r3 14 ; CHECK: br %r14 15 %cond = icmp ult i32 %limit, 42 16 %res = select i1 %cond, i32 %a, i32 %b 17 ret i32 %res 18 } 19 20 ; Test LOCGR. 21 define i64 @f2(i64 %a, i64 %b, i64 %limit) { 22 ; CHECK-LABEL: f2: 23 ; CHECK: clgfi %r4, 42 24 ; CHECK: locgrhe %r2, %r3 25 ; CHECK: br %r14 26 %cond = icmp ult i64 %limit, 42 27 %res = select i1 %cond, i64 %a, i64 %b 28 ret i64 %res 29 } 30 31 ; Test LOCR in a case that could use COMPARE AND BRANCH. We prefer using 32 ; LOCR if possible. 33 define i32 @f3(i32 %a, i32 %b, i32 %limit) { 34 ; CHECK-LABEL: f3: 35 ; CHECK: chi %r4, 42 36 ; CHECK: locrlh %r2, %r3 37 ; CHECK: br %r14 38 %cond = icmp eq i32 %limit, 42 39 %res = select i1 %cond, i32 %a, i32 %b 40 ret i32 %res 41 } 42 43 ; ...and again for LOCGR. 44 define i64 @f4(i64 %a, i64 %b, i64 %limit) { 45 ; CHECK-LABEL: f4: 46 ; CHECK: cghi %r4, 42 47 ; CHECK: locgrlh %r2, %r3 48 ; CHECK: br %r14 49 %cond = icmp eq i64 %limit, 42 50 %res = select i1 %cond, i64 %a, i64 %b 51 ret i64 %res 52 } 53 54 ; Check that we also get LOCR as a result of early if-conversion. 55 define i32 @f5(i32 %a, i32 %b, i32 %limit) { 56 ; CHECK-LABEL: f5: 57 ; CHECK: clfi %r4, 41 58 ; CHECK: locrh %r2, %r3 59 ; CHECK: br %r14 60 entry: 61 %cond = icmp ult i32 %limit, 42 62 br i1 %cond, label %if.then, label %return 63 64 if.then: 65 br label %return 66 67 return: 68 %res = phi i32 [ %a, %if.then ], [ %b, %entry ] 69 ret i32 %res 70 } 71 72 ; ... and likewise for LOCGR. 73 define i64 @f6(i64 %a, i64 %b, i64 %limit) { 74 ; CHECK-LABEL: f6: 75 ; CHECK: clgfi %r4, 41 76 ; CHECK: locgrh %r2, %r3 77 ; CHECK: br %r14 78 entry: 79 %cond = icmp ult i64 %limit, 42 80 br i1 %cond, label %if.then, label %return 81 82 if.then: 83 br label %return 84 85 return: 86 %res = phi i64 [ %a, %if.then ], [ %b, %entry ] 87 ret i64 %res 88 } 89 90 ; Check that inverting the condition works as well. 91 define i32 @f7(i32 %a, i32 %b, i32 %limit) { 92 ; CHECK-LABEL: f7: 93 ; CHECK: clfi %r4, 41 94 ; CHECK: locrle %r2, %r3 95 ; CHECK: br %r14 96 entry: 97 %cond = icmp ult i32 %limit, 42 98 br i1 %cond, label %if.then, label %return 99 100 if.then: 101 br label %return 102 103 return: 104 %res = phi i32 [ %b, %if.then ], [ %a, %entry ] 105 ret i32 %res 106 } 107 108 ; ... and likewise for LOCGR. 109 define i64 @f8(i64 %a, i64 %b, i64 %limit) { 110 ; CHECK-LABEL: f8: 111 ; CHECK: clgfi %r4, 41 112 ; CHECK: locgrle %r2, %r3 113 ; CHECK: br %r14 114 entry: 115 %cond = icmp ult i64 %limit, 42 116 br i1 %cond, label %if.then, label %return 117 118 if.then: 119 br label %return 120 121 return: 122 %res = phi i64 [ %b, %if.then ], [ %a, %entry ] 123 ret i64 %res 124 } 125 126