@@ -575,47 +575,75 @@ void b1(bool a, bool b) {
575575
576576
577577// LLVM-LABEL: define void @_Z2b1bb(
578- // LLVM-SAME: i1 %[[ARG0:[0-9] +]], i1 %[[ARG1:[0-9] +]])
579- // LLVM: %[[A_ADDR:.*]] = alloca i8, i64 1
580- // LLVM: %[[B_ADDR:.*]] = alloca i8, i64 1
581- // LLVM: %[[X:.*]] = alloca i8, i64 1
578+ // LLVM-SAME: i1 %[[ARG0:. +]], i1 %[[ARG1:. +]])
579+ // LLVM: %[[A_ADDR:.*]] = alloca i8
580+ // LLVM: %[[B_ADDR:.*]] = alloca i8
581+ // LLVM: %[[X:.*]] = alloca i8
582582// LLVM: %[[ZEXT0:.*]] = zext i1 %[[ARG0]] to i8
583583// LLVM: store i8 %[[ZEXT0]], ptr %[[A_ADDR]]
584584// LLVM: %[[ZEXT1:.*]] = zext i1 %[[ARG1]] to i8
585585// LLVM: store i8 %[[ZEXT1]], ptr %[[B_ADDR]]
586586// LLVM: %[[A_VAL:.*]] = load i8, ptr %[[A_ADDR]]
587587// LLVM: %[[A_BOOL:.*]] = trunc i8 %[[A_VAL]] to i1
588- // LLVM: br i1 %[[A_BOOL]], label %[[AND_TRUE:[0-9] +]], label %[[AND_FALSE:[0-9] +]]
588+ // LLVM: br i1 %[[A_BOOL]], label %[[AND_TRUE:. +]], label %[[AND_FALSE:. +]]
589589// LLVM: [[AND_TRUE]]:
590590// LLVM: %[[B_VAL:.*]] = load i8, ptr %[[B_ADDR]]
591591// LLVM: %[[B_BOOL:.*]] = trunc i8 %[[B_VAL]] to i1
592- // LLVM: br label %[[AND_MERGE:[0-9] +]]
592+ // LLVM: br label %[[AND_MERGE:. +]]
593593// LLVM: [[AND_FALSE]]:
594594// LLVM: br label %[[AND_MERGE]]
595595// LLVM: [[AND_MERGE]]:
596596// LLVM: %[[AND_PHI:.*]] = phi i1 [ false, %[[AND_FALSE]] ], [ %[[B_BOOL]], %[[AND_TRUE]] ]
597- // LLVM: br label %[[AND_CONT:[0-9]+]]
598- // LLVM: [[AND_CONT]]:
599597// LLVM: %[[ZEXT_AND:.*]] = zext i1 %[[AND_PHI]] to i8
600598// LLVM: store i8 %[[ZEXT_AND]], ptr %[[X]]
601599// LLVM: %[[X_VAL:.*]] = load i8, ptr %[[X]]
602600// LLVM: %[[X_BOOL:.*]] = trunc i8 %[[X_VAL]] to i1
603- // LLVM: br i1 %[[X_BOOL]], label %[[OR_TRUE:[0-9] +]], label %[[OR_FALSE:[0-9] +]]
601+ // LLVM: br i1 %[[X_BOOL]], label %[[OR_TRUE:. +]], label %[[OR_FALSE:. +]]
604602// LLVM: [[OR_TRUE]]:
605- // LLVM: br label %[[OR_MERGE:[0-9] +]]
603+ // LLVM: br label %[[OR_MERGE:. +]]
606604// LLVM: [[OR_FALSE]]:
607605// LLVM: %[[B_VAL2:.*]] = load i8, ptr %[[B_ADDR]]
608606// LLVM: %[[B_BOOL2:.*]] = trunc i8 %[[B_VAL2]] to i1
609607// LLVM: br label %[[OR_MERGE]]
610608// LLVM: [[OR_MERGE]]:
611609// LLVM: %[[OR_PHI:.*]] = phi i1 [ %[[B_BOOL2]], %[[OR_FALSE]] ], [ true, %[[OR_TRUE]] ]
612- // LLVM: br label %[[OR_CONT:[0-9]+]]
613- // LLVM: [[OR_CONT]]:
614610// LLVM: %[[ZEXT_OR:.*]] = zext i1 %[[OR_PHI]] to i8
615611// LLVM: store i8 %[[ZEXT_OR]], ptr %[[X]]
616612// LLVM: ret void
617613
618-
614+ // OGCG-LABEL: define dso_local void @_Z2b1bb
615+ // OGCG-SAME: (i1 {{.*}} %[[ARG0:.+]], i1 {{.*}} %[[ARG1:.+]])
616+ // OGCG: [[ENTRY:.*]]:
617+ // OGCG: %[[A_ADDR:.*]] = alloca i8
618+ // OGCG: %[[B_ADDR:.*]] = alloca i8
619+ // OGCG: %[[X:.*]] = alloca i8
620+ // OGCG: %[[ZEXT0:.*]] = zext i1 %[[ARG0]] to i8
621+ // OGCG: store i8 %[[ZEXT0]], ptr %[[A_ADDR]]
622+ // OGCG: %[[ZEXT1:.*]] = zext i1 %[[ARG1]] to i8
623+ // OGCG: store i8 %[[ZEXT1]], ptr %[[B_ADDR]]
624+ // OGCG: %[[A_VAL:.*]] = load i8, ptr %[[A_ADDR]]
625+ // OGCG: %[[A_BOOL:.*]] = trunc i8 %[[A_VAL]] to i1
626+ // OGCG: br i1 %[[A_BOOL]], label %[[AND_TRUE:.+]], label %[[AND_MERGE:.+]]
627+ // OGCG: [[AND_TRUE]]:
628+ // OGCG: %[[B_VAL:.*]] = load i8, ptr %[[B_ADDR]]
629+ // OGCG: %[[B_BOOL:.*]] = trunc i8 %[[B_VAL]] to i1
630+ // OGCG: br label %[[AND_MERGE:.+]]
631+ // OGCG: [[AND_MERGE]]:
632+ // OGCG: %[[AND_PHI:.*]] = phi i1 [ false, %[[ENTRY]] ], [ %[[B_BOOL]], %[[AND_TRUE]] ]
633+ // OGCG: %[[ZEXT_AND:.*]] = zext i1 %[[AND_PHI]] to i8
634+ // OGCG: store i8 %[[ZEXT_AND]], ptr %[[X]]
635+ // OGCG: %[[X_VAL:.*]] = load i8, ptr %[[X]]
636+ // OGCG: %[[X_BOOL:.*]] = trunc i8 %[[X_VAL]] to i1
637+ // OGCG: br i1 %[[X_BOOL]], label %[[OR_MERGE:.+]], label %[[OR_FALSE:.+]]
638+ // OGCG: [[OR_FALSE]]:
639+ // OGCG: %[[B_VAL2:.*]] = load i8, ptr %[[B_ADDR]]
640+ // OGCG: %[[B_BOOL2:.*]] = trunc i8 %[[B_VAL2]] to i1
641+ // OGCG: br label %[[OR_MERGE]]
642+ // OGCG: [[OR_MERGE]]:
643+ // OGCG: %[[OR_PHI:.*]] = phi i1 [ true, %[[AND_MERGE]] ], [ %[[B_BOOL2]], %[[OR_FALSE]] ]
644+ // OGCG: %[[ZEXT_OR:.*]] = zext i1 %[[OR_PHI]] to i8
645+ // OGCG: store i8 %[[ZEXT_OR]], ptr %[[X]]
646+ // OGCG: ret void
619647
620648void b3 (int a, int b, int c, int d) {
621649 bool x = (a == b) && (c == d);
@@ -663,7 +691,7 @@ void b3(int a, int b, int c, int d) {
663691
664692
665693// LLVM-LABEL: define void @_Z2b3iiii(
666- // LLVM-SAME: i32 %[[ARG0:[0-9] +]], i32 %[[ARG1:[0-9] +]], i32 %[[ARG2:[0-9] +]], i32 %[[ARG3:[0-9] +]])
694+ // LLVM-SAME: i32 %[[ARG0:. +]], i32 %[[ARG1:. +]], i32 %[[ARG2:. +]], i32 %[[ARG3:. +]])
667695// LLVM: %[[A_ADDR:.*]] = alloca i32, i64 1
668696// LLVM: %[[B_ADDR:.*]] = alloca i32, i64 1
669697// LLVM: %[[C_ADDR:.*]] = alloca i32, i64 1
@@ -676,35 +704,71 @@ void b3(int a, int b, int c, int d) {
676704// LLVM: %[[A_VAL:.*]] = load i32, ptr %[[A_ADDR]]
677705// LLVM: %[[B_VAL:.*]] = load i32, ptr %[[B_ADDR]]
678706// LLVM: %[[CMP1:.*]] = icmp eq i32 %[[A_VAL]], %[[B_VAL]]
679- // LLVM: br i1 %[[CMP1]], label %[[AND_TRUE:[0-9] +]], label %[[AND_FALSE:[0-9] +]]
707+ // LLVM: br i1 %[[CMP1]], label %[[AND_TRUE:. +]], label %[[AND_FALSE:. +]]
680708// LLVM: [[AND_TRUE]]:
681709// LLVM: %[[C_VAL:.*]] = load i32, ptr %[[C_ADDR]]
682710// LLVM: %[[D_VAL:.*]] = load i32, ptr %[[D_ADDR]]
683711// LLVM: %[[CMP2:.*]] = icmp eq i32 %[[C_VAL]], %[[D_VAL]]
684- // LLVM: br label %[[AND_MERGE:[0-9] +]]
712+ // LLVM: br label %[[AND_MERGE:. +]]
685713// LLVM: [[AND_FALSE]]:
686714// LLVM: br label %[[AND_MERGE]]
687715// LLVM: [[AND_MERGE]]:
688716// LLVM: %[[AND_PHI:.*]] = phi i1 [ false, %[[AND_FALSE]] ], [ %[[CMP2]], %[[AND_TRUE]] ]
689- // LLVM: br label %[[AND_CONT:[0-9]+]]
690- // LLVM: [[AND_CONT]]:
691717// LLVM: %[[ZEXT_AND:.*]] = zext i1 %[[AND_PHI]] to i8
692718// LLVM: store i8 %[[ZEXT_AND]], ptr %[[X]]
693719// LLVM: %[[A_VAL2:.*]] = load i32, ptr %[[A_ADDR]]
694720// LLVM: %[[B_VAL2:.*]] = load i32, ptr %[[B_ADDR]]
695721// LLVM: %[[CMP3:.*]] = icmp eq i32 %[[A_VAL2]], %[[B_VAL2]]
696- // LLVM: br i1 %[[CMP3]], label %[[OR_TRUE:[0-9] +]], label %[[OR_FALSE:[0-9] +]]
722+ // LLVM: br i1 %[[CMP3]], label %[[OR_TRUE:. +]], label %[[OR_FALSE:. +]]
697723// LLVM: [[OR_TRUE]]:
698- // LLVM: br label %[[OR_MERGE:[0-9] +]]
724+ // LLVM: br label %[[OR_MERGE:. +]]
699725// LLVM: [[OR_FALSE]]:
700726// LLVM: %[[C_VAL2:.*]] = load i32, ptr %[[C_ADDR]]
701727// LLVM: %[[D_VAL2:.*]] = load i32, ptr %[[D_ADDR]]
702728// LLVM: %[[CMP4:.*]] = icmp eq i32 %[[C_VAL2]], %[[D_VAL2]]
703729// LLVM: br label %[[OR_MERGE]]
704730// LLVM: [[OR_MERGE]]:
705731// LLVM: %[[OR_PHI:.*]] = phi i1 [ %[[CMP4]], %[[OR_FALSE]] ], [ true, %[[OR_TRUE]] ]
706- // LLVM: br label %[[OR_CONT:[0-9]+]]
707- // LLVM: [[OR_CONT]]:
708732// LLVM: %[[ZEXT_OR:.*]] = zext i1 %[[OR_PHI]] to i8
709733// LLVM: store i8 %[[ZEXT_OR]], ptr %[[X]]
710734// LLVM: ret void
735+
736+ // OGCG-LABEL: define dso_local void @_Z2b3iiii(
737+ // OGCG-SAME: i32 {{.*}} %[[ARG0:.+]], i32 {{.*}} %[[ARG1:.+]], i32 {{.*}} %[[ARG2:.+]], i32 {{.*}} %[[ARG3:.+]])
738+ // OGCG: [[ENTRY:.*]]:
739+ // OGCG: %[[A_ADDR:.*]] = alloca i32
740+ // OGCG: %[[B_ADDR:.*]] = alloca i32
741+ // OGCG: %[[C_ADDR:.*]] = alloca i32
742+ // OGCG: %[[D_ADDR:.*]] = alloca i32
743+ // OGCG: %[[X:.*]] = alloca i8
744+ // OGCG: store i32 %[[ARG0]], ptr %[[A_ADDR]]
745+ // OGCG: store i32 %[[ARG1]], ptr %[[B_ADDR]]
746+ // OGCG: store i32 %[[ARG2]], ptr %[[C_ADDR]]
747+ // OGCG: store i32 %[[ARG3]], ptr %[[D_ADDR]]
748+ // OGCG: %[[A_VAL:.*]] = load i32, ptr %[[A_ADDR]]
749+ // OGCG: %[[B_VAL:.*]] = load i32, ptr %[[B_ADDR]]
750+ // OGCG: %[[CMP1:.*]] = icmp eq i32 %[[A_VAL]], %[[B_VAL]]
751+ // OGCG: br i1 %[[CMP1]], label %[[AND_TRUE:.+]], label %[[AND_MERGE:.+]]
752+ // OGCG: [[AND_TRUE]]:
753+ // OGCG: %[[C_VAL:.*]] = load i32, ptr %[[C_ADDR]]
754+ // OGCG: %[[D_VAL:.*]] = load i32, ptr %[[D_ADDR]]
755+ // OGCG: %[[CMP2:.*]] = icmp eq i32 %[[C_VAL]], %[[D_VAL]]
756+ // OGCG: br label %[[AND_MERGE:.+]]
757+ // OGCG: [[AND_MERGE]]:
758+ // OGCG: %[[AND_PHI:.*]] = phi i1 [ false, %[[ENTRY]] ], [ %[[CMP2]], %[[AND_TRUE]] ]
759+ // OGCG: %[[ZEXT_AND:.*]] = zext i1 %[[AND_PHI]] to i8
760+ // OGCG: store i8 %[[ZEXT_AND]], ptr %[[X]]
761+ // OGCG: %[[A_VAL2:.*]] = load i32, ptr %[[A_ADDR]]
762+ // OGCG: %[[B_VAL2:.*]] = load i32, ptr %[[B_ADDR]]
763+ // OGCG: %[[CMP3:.*]] = icmp eq i32 %[[A_VAL2]], %[[B_VAL2]]
764+ // OGCG: br i1 %[[CMP3]], label %[[OR_MERGE:.+]], label %[[OR_FALSE:.+]]
765+ // OGCG: [[OR_FALSE]]:
766+ // OGCG: %[[C_VAL2:.*]] = load i32, ptr %[[C_ADDR]]
767+ // OGCG: %[[D_VAL2:.*]] = load i32, ptr %[[D_ADDR]]
768+ // OGCG: %[[CMP4:.*]] = icmp eq i32 %[[C_VAL2]], %[[D_VAL2]]
769+ // OGCG: br label %[[OR_MERGE]]
770+ // OGCG: [[OR_MERGE]]:
771+ // OGCG: %[[OR_PHI:.*]] = phi i1 [ true, %[[AND_MERGE]] ], [ %[[CMP4]], %[[OR_FALSE]] ]
772+ // OGCG: %[[ZEXT_OR:.*]] = zext i1 %[[OR_PHI]] to i8
773+ // OGCG: store i8 %[[ZEXT_OR]], ptr %[[X]]
774+ // OGCG: ret void
0 commit comments