brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.5 KiB · dbc51fb Raw
221 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -passes=loop-rotate < %s -verify-loop-info -verify-dom-info -verify-memoryssa | FileCheck %s3 4target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"5target triple = "thumbv8m.base-arm-none-eabi"6 7%struct.List = type { ptr, i32 }8 9define void @list_add(ptr nocapture %list, ptr %data) {10; CHECK-LABEL: @list_add(11; CHECK-NEXT:  entry:12; CHECK-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[LIST:%.*]], align 413; CHECK-NEXT:    [[VAL2:%.*]] = getelementptr inbounds [[STRUCT_LIST:%.*]], ptr [[TMP0]], i32 0, i32 114; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[VAL2]], align 415; CHECK-NEXT:    [[VAL1:%.*]] = getelementptr inbounds [[STRUCT_LIST]], ptr [[DATA:%.*]], i32 0, i32 116; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[VAL1]], align 417; CHECK-NEXT:    [[CMP3:%.*]] = icmp slt i32 [[TMP1]], [[TMP2]]18; CHECK-NEXT:    br i1 [[CMP3]], label [[IF_THEN_LR_PH:%.*]], label [[IF_ELSE6:%.*]]19; CHECK:       if.then.lr.ph:20; CHECK-NEXT:    br label [[IF_THEN:%.*]]21; CHECK:       for.cond:22; CHECK-NEXT:    [[CURR_0:%.*]] = phi ptr [ [[TMP5:%.*]], [[IF_THEN]] ]23; CHECK-NEXT:    [[PREV_0:%.*]] = phi ptr [ [[CURR_04:%.*]], [[IF_THEN]] ]24; CHECK-NEXT:    [[VAL:%.*]] = getelementptr inbounds [[STRUCT_LIST]], ptr [[CURR_0]], i32 0, i32 125; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[VAL]], align 426; CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr [[VAL1]], align 427; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[TMP3]], [[TMP4]]28; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN]], label [[FOR_COND_IF_ELSE6_CRIT_EDGE:%.*]]29; CHECK:       if.then:30; CHECK-NEXT:    [[CURR_04]] = phi ptr [ [[TMP0]], [[IF_THEN_LR_PH]] ], [ [[CURR_0]], [[FOR_COND:%.*]] ]31; CHECK-NEXT:    [[TMP5]] = load ptr, ptr [[CURR_04]], align 432; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp eq ptr [[TMP5]], null33; CHECK-NEXT:    br i1 [[TOBOOL]], label [[IF_ELSE:%.*]], label [[FOR_COND]]34; CHECK:       if.else:35; CHECK-NEXT:    [[NEXT_LCSSA:%.*]] = phi ptr [ [[CURR_04]], [[IF_THEN]] ]36; CHECK-NEXT:    store ptr [[DATA]], ptr [[NEXT_LCSSA]], align 437; CHECK-NEXT:    store ptr null, ptr [[DATA]], align 438; CHECK-NEXT:    br label [[FOR_END:%.*]]39; CHECK:       for.cond.if.else6_crit_edge:40; CHECK-NEXT:    [[SPLIT:%.*]] = phi ptr [ [[PREV_0]], [[FOR_COND]] ]41; CHECK-NEXT:    br label [[IF_ELSE6]]42; CHECK:       if.else6:43; CHECK-NEXT:    [[PREV_0_LCSSA:%.*]] = phi ptr [ [[SPLIT]], [[FOR_COND_IF_ELSE6_CRIT_EDGE]] ], [ null, [[ENTRY:%.*]] ]44; CHECK-NEXT:    [[TOBOOL7:%.*]] = icmp eq ptr [[PREV_0_LCSSA]], null45; CHECK-NEXT:    br i1 [[TOBOOL7]], label [[IF_ELSE12:%.*]], label [[IF_THEN8:%.*]]46; CHECK:       if.then8:47; CHECK-NEXT:    [[TMP7:%.*]] = load i32, ptr [[PREV_0_LCSSA]], align 448; CHECK-NEXT:    store i32 [[TMP7]], ptr [[DATA]], align 449; CHECK-NEXT:    store ptr [[DATA]], ptr [[PREV_0_LCSSA]], align 450; CHECK-NEXT:    br label [[FOR_END]]51; CHECK:       if.else12:52; CHECK-NEXT:    [[TMP10:%.*]] = load i32, ptr [[LIST]], align 453; CHECK-NEXT:    store i32 [[TMP10]], ptr [[DATA]], align 454; CHECK-NEXT:    store ptr [[DATA]], ptr [[LIST]], align 455; CHECK-NEXT:    br label [[FOR_END]]56; CHECK:       for.end:57; CHECK-NEXT:    ret void58;59entry:60  %0 = load ptr, ptr %list, align 461  br label %for.cond62 63for.cond:                                         ; preds = %if.then, %entry64  %curr.0 = phi ptr [ %0, %entry ], [ %3, %if.then ]65  %prev.0 = phi ptr [ null, %entry ], [ %curr.0, %if.then ]66  %val = getelementptr inbounds %struct.List, ptr %curr.0, i32 0, i32 167  %1 = load i32, ptr %val, align 468  %val1 = getelementptr inbounds %struct.List, ptr %data, i32 0, i32 169  %2 = load i32, ptr %val1, align 470  %cmp = icmp slt i32 %1, %271  br i1 %cmp, label %if.then, label %if.else672 73if.then:                                          ; preds = %for.cond74  %3 = load ptr, ptr %curr.0, align 475  %tobool = icmp eq ptr %3, null76  br i1 %tobool, label %if.else, label %for.cond77 78if.else:                                          ; preds = %if.then79  %next.lcssa = phi ptr [ %curr.0, %if.then ]80  store ptr %data, ptr %next.lcssa, align 481  store ptr null, ptr %data, align 482  br label %for.end83 84if.else6:                                         ; preds = %for.cond85  %prev.0.lcssa = phi ptr [ %prev.0, %for.cond ]86  %tobool7 = icmp eq ptr %prev.0.lcssa, null87  br i1 %tobool7, label %if.else12, label %if.then888 89if.then8:                                         ; preds = %if.else690  %4 = load i32, ptr %prev.0.lcssa, align 491  store i32 %4, ptr %data, align 492  store ptr %data, ptr %prev.0.lcssa, align 493  br label %for.end94 95if.else12:                                        ; preds = %if.else696  %5 = load i32, ptr %list, align 497  store i32 %5, ptr %data, align 498  store ptr %data, ptr %list, align 499  br label %for.end100 101for.end:                                          ; preds = %if.else12, %if.then8, %if.else102  ret void103}104 105define i32 @test2(ptr %l) {106; CHECK-LABEL: @test2(107; CHECK-NEXT:  entry:108; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[L:%.*]], align 4109; CHECK-NEXT:    [[TOBOOL2:%.*]] = icmp eq i32 [[TMP0]], 0110; CHECK-NEXT:    br i1 [[TOBOOL2]], label [[CLEANUP:%.*]], label [[DO_COND_LR_PH:%.*]]111; CHECK:       do.cond.lr.ph:112; CHECK-NEXT:    br label [[DO_COND:%.*]]113; CHECK:       do.body:114; CHECK-NEXT:    [[A_0:%.*]] = phi i32 [ [[REM:%.*]], [[DO_COND]] ]115; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[L]], align 4116; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp eq i32 [[TMP1]], 0117; CHECK-NEXT:    br i1 [[TOBOOL]], label [[DO_BODY_CLEANUP_CRIT_EDGE:%.*]], label [[DO_COND]]118; CHECK:       do.body.cleanup_crit_edge:119; CHECK-NEXT:    [[SPLIT:%.*]] = phi i32 [ [[A_0]], [[DO_BODY:%.*]] ]120; CHECK-NEXT:    br label [[CLEANUP]]121; CHECK:       cleanup:122; CHECK-NEXT:    [[A_0_LCSSA:%.*]] = phi i32 [ [[SPLIT]], [[DO_BODY_CLEANUP_CRIT_EDGE]] ], [ 100, [[ENTRY:%.*]] ]123; CHECK-NEXT:    store i32 10, ptr [[L]], align 4124; CHECK-NEXT:    br label [[CLEANUP2:%.*]]125; CHECK:       do.cond:126; CHECK-NEXT:    [[TMP2:%.*]] = phi i32 [ [[TMP0]], [[DO_COND_LR_PH]] ], [ [[TMP1]], [[DO_BODY]] ]127; CHECK-NEXT:    [[MUL:%.*]] = mul nsw i32 [[TMP2]], 13128; CHECK-NEXT:    [[REM]] = srem i32 [[MUL]], 27129; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[L]], align 4130; CHECK-NEXT:    [[TOBOOL1:%.*]] = icmp eq i32 [[TMP3]], 0131; CHECK-NEXT:    br i1 [[TOBOOL1]], label [[CLEANUP2_LOOPEXIT:%.*]], label [[DO_BODY]]132; CHECK:       cleanup2.loopexit:133; CHECK-NEXT:    br label [[CLEANUP2]]134; CHECK:       cleanup2:135; CHECK-NEXT:    [[RETVAL_2:%.*]] = phi i32 [ [[A_0_LCSSA]], [[CLEANUP]] ], [ 0, [[CLEANUP2_LOOPEXIT]] ]136; CHECK-NEXT:    ret i32 [[RETVAL_2]]137;138entry:139  br label %do.body140 141do.body:                                          ; preds = %do.cond, %entry142  %a.0 = phi i32 [ 100, %entry ], [ %rem, %do.cond ]143  %0 = load i32, ptr %l, align 4144  %tobool = icmp eq i32 %0, 0145  br i1 %tobool, label %cleanup, label %do.cond146 147cleanup:                                          ; preds = %do.body148  %a.0.lcssa = phi i32 [ %a.0, %do.body ]149  store i32 10, ptr %l, align 4150  br label %cleanup2151 152do.cond:                                          ; preds = %do.body153  %mul = mul nsw i32 %0, 13154  %rem = srem i32 %mul, 27155  %1 = load i32, ptr %l, align 4156  %tobool1 = icmp eq i32 %1, 0157  br i1 %tobool1, label %cleanup2.loopexit, label %do.body158 159cleanup2.loopexit:                                ; preds = %do.cond160  br label %cleanup2161 162cleanup2:                                         ; preds = %cleanup2.loopexit, %cleanup163  %retval.2 = phi i32 [ %a.0.lcssa, %cleanup ], [ 0, %cleanup2.loopexit ]164  ret i32 %retval.2165}166 167define i32 @no_rotate(ptr %l) {168; CHECK-LABEL: @no_rotate(169; CHECK-NEXT:  entry:170; CHECK-NEXT:    br label [[DO_BODY:%.*]]171; CHECK:       do.body:172; CHECK-NEXT:    [[A_0:%.*]] = phi i32 [ 100, [[ENTRY:%.*]] ], [ [[REM:%.*]], [[DO_COND:%.*]] ]173; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[L:%.*]], align 4174; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp eq i32 [[TMP0]], 0175; CHECK-NEXT:    br i1 [[TOBOOL]], label [[CLEANUP:%.*]], label [[DO_COND]]176; CHECK:       cleanup:177; CHECK-NEXT:    [[A_0_LCSSA:%.*]] = phi i32 [ [[A_0]], [[DO_BODY]] ]178; CHECK-NEXT:    store i32 10, ptr [[L]], align 4179; CHECK-NEXT:    br label [[CLEANUP2:%.*]]180; CHECK:       do.cond:181; CHECK-NEXT:    [[MUL:%.*]] = mul nsw i32 [[A_0]], 13182; CHECK-NEXT:    [[REM]] = srem i32 [[MUL]], 27183; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[L]], align 4184; CHECK-NEXT:    [[TOBOOL1:%.*]] = icmp eq i32 [[TMP1]], 0185; CHECK-NEXT:    br i1 [[TOBOOL1]], label [[CLEANUP2_LOOPEXIT:%.*]], label [[DO_BODY]]186; CHECK:       cleanup2.loopexit:187; CHECK-NEXT:    br label [[CLEANUP2]]188; CHECK:       cleanup2:189; CHECK-NEXT:    [[RETVAL_2:%.*]] = phi i32 [ [[A_0_LCSSA]], [[CLEANUP]] ], [ 0, [[CLEANUP2_LOOPEXIT]] ]190; CHECK-NEXT:    ret i32 [[RETVAL_2]]191;192entry:193  br label %do.body194 195do.body:                                          ; preds = %do.cond, %entry196  %a.0 = phi i32 [ 100, %entry ], [ %rem, %do.cond ]197  %0 = load i32, ptr %l, align 4198  %tobool = icmp eq i32 %0, 0199  br i1 %tobool, label %cleanup, label %do.cond200 201cleanup:                                          ; preds = %do.body202  %a.0.lcssa = phi i32 [ %a.0, %do.body ]203  store i32 10, ptr %l, align 4204  br label %cleanup2205 206do.cond:                                          ; preds = %do.body207  %mul = mul nsw i32 %a.0, 13208  %rem = srem i32 %mul, 27209  %1 = load i32, ptr %l, align 4210  %tobool1 = icmp eq i32 %1, 0211  br i1 %tobool1, label %cleanup2.loopexit, label %do.body212 213cleanup2.loopexit:                                ; preds = %do.cond214  br label %cleanup2215 216cleanup2:                                         ; preds = %cleanup2.loopexit, %cleanup217  %retval.2 = phi i32 [ %a.0.lcssa, %cleanup ], [ 0, %cleanup2.loopexit ]218  ret i32 %retval.2219}220 221