@@ -901,3 +901,40 @@ loop:
901901exit:
902902 ret void
903903}
904+
905+ declare void @use (i128 )
906+
907+ define void @sext_i128 (ptr %a ) {
908+ ; CHECK-LABEL: @sext_i128(
909+ ; CHECK-NEXT: entry:
910+ ; CHECK-NEXT: br label [[LOOP:%.*]]
911+ ; CHECK: loop:
912+ ; CHECK-NEXT: [[LOAD:%.*]] = load i128, ptr [[A:%.*]], align 16
913+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i128 [[LOAD]], 0
914+ ; CHECK-NEXT: [[SEXT1:%.*]] = sext i1 [[CMP1]] to i128
915+ ; CHECK-NEXT: [[CMP1_FROZEN:%.*]] = freeze i1 [[CMP1]]
916+ ; CHECK-NEXT: br i1 [[CMP1_FROZEN]], label [[SELECT_TRUE_SINK:%.*]], label [[SELECT_END:%.*]]
917+ ; CHECK: select.true.sink:
918+ ; CHECK-NEXT: [[TMP0:%.*]] = add i128 -1, 0
919+ ; CHECK-NEXT: br label [[SELECT_END]]
920+ ; CHECK: select.end:
921+ ; CHECK-NEXT: [[ADD:%.*]] = phi i128 [ [[TMP0]], [[SELECT_TRUE_SINK]] ], [ 0, [[LOOP]] ]
922+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i128 [[ADD]], 0
923+ ; CHECK-NEXT: br i1 [[CMP2]], label [[LOOP]], label [[EXIT:%.*]]
924+ ; CHECK: exit:
925+ ; CHECK-NEXT: ret void
926+ ;
927+ entry:
928+ br label %loop
929+
930+ loop:
931+ %load = load i128 , ptr %a , align 16
932+ %cmp1 = icmp slt i128 %load , 0
933+ %sext1 = sext i1 %cmp1 to i128
934+ %add = add i128 %sext1 , 0
935+ %cmp2 = icmp slt i128 %add , 0
936+ br i1 %cmp2 , label %loop , label %exit
937+
938+ exit:
939+ ret void
940+ }
0 commit comments